Рассмотрим следующую проблему:
- Таблица «Рисунок» с идентификатором, заголовком, размером.
- Таблица «Цвет» с идентификатором, меткой.
- Таблица соединений 'Pic_Col' с picture_id, color_id
- Каждое изображение имеет от 1 до n цветов
Я пытаюсь найти в SQL (DB2, но мне любопытно, что касается других СУБДвозможности) способ вернуть что-то, что ответило бы на следующие вопросы:
- Один запрос для:
Содержит ли изображение с идентификатором X только синий и желтый цвета?
Один запрос для:
Содержит ли изображение с идентификатором Y хотя бы синий и желтый цвета?
Содержит ли изображение с идентификатором Zнаименее синий и желтый, но без красного?
Я хотел бы предоставить в качестве параметров: идентификатор изображения, список желаемых цветов, список нежелательных цветов.
Единственные решения, которые мне удалось найти, основаны на EXISTS
с подзапросами или X объединениями (X - это номер цвета iв запросе) и агрегация (CASE WHEN
и т. д.) ...
SELECT 1
FROM
picture p
WHERE
p.id = 123
AND EXISTS (
SELECT 1
FROM pic_col pc
INNER JOIN color c ON (c.id = pc.color_id AND c.label = 'blue')
WHERE
pc.picture_id = p.id
)
AND EXISTS (
SELECT 1
FROM pic_col pc
INNER JOIN color c ON (c.id = pc.color_id AND c.label = 'yellow')
WHERE
pc.picture_id = p.id
)
AND NOT EXISTS (
SELECT 1
FROM pic_col pc
INNER JOIN color c ON (c.id = pc.color_id AND c.label = 'red')
WHERE
pc.picture_id = p.id
);