2017-02-21 11 views
3

Я не могу поверить, что я первый человек, кто когда-либо спрашивал об этом, но у меня возникли проблемы с поиском правильного пути для достижения следующего запроса. Логично кажется, что это просто, но я пытаюсь его закодироватьВыберите, где весь список из 1 таблицы соответствует некоторым другим

У меня есть 2 стола, я хотел бы получить все автомобили и cust_id из таблицы 1, где полный список цветов из таблицы 2 (сгруппированы по автомобиль) соответствует цветам из таблицы 1. Камнем преткновения является то, что не все цвета в таблице 1 должны быть в таблице 2

Я экспериментировал с соединениями, существует и пересекается, но безрезультатно все код, подобный ниже, будет соответствовать, если по крайней мере 1 элемент соответствует, но не все.

SELECT 
a.Cust_Id, 
a.Car 
FROM Table1 a 
JOIN Table2 b ON a.Car = b.Car and a.Colour = b.Colour 
GROUP BY a.Cust_Id, a.Car 

Это часть гораздо большего сценария делать много других вещей, так что я использовал автомобили/цвета в качестве примера, поэтому оценить не имеет особого смысла в этом контексте.

Таблица1

enter image description here

Table2

enter image description here

Ожидаемые результаты

Output 
1 Audi 
1 Ford 
2 VW 
+0

Добавлены примеры таблиц и ожидаемый результат. – gregdanish

+0

@TimBiegeleisen, в ответе да, но не в запросе OP. – jarlh

ответ

4

Для каждой группы, подсчитать количество NULL цветов от Table1 и убедитесь, что этот счет равен нулю. Это означает, что каждый цвет во второй таблице сопоставляется с цветом в первой таблице.

SELECT b.Cust_Id, 
     b.Car 
FROM Table1 a 
RIGHT JOIN 
(
    SELECT 1 AS Cust_ID, Car, Colour 
    FROM Table2 
    UNION ALL 
    SELECT 2, Car, Colour 
    FROM Table2 
) b 
    ON a.Car = b.Car  AND 
     a.Colour = b.Colour AND 
     a.Cust_ID = b.Cust_ID 
GROUP BY b.Cust_Id, 
     b.Car 
HAVING SUM(CASE WHEN a.Colour IS NULL THEN 1 ELSE 0 END) = 0 

Обратите внимание, что я использовал подзапрос, чтобы улучшить вторую таблицу требований к цвету. Я добавил столбец Cust_ID, исходя из предположения, что каждый клиент имеет те же требования, чтобы упростить обработку и анализ соединения.

+0

Спасибо Тиму, я согласен с вашей логикой, хотя этот вывод дает мне Ford и VW для Cust 1 и Audi и VW для Cust 2, поскольку он соответствует тому факту, что 1 из пунктов существует в таблице 2, а не во всех. – gregdanish

+0

Вы хотите, чтобы каждый автомобиль имел _all_ цвета во втором столе? –

+0

Да, все записи из таблицы 1 отображаются только в том случае, если все цвета указаны в таблице2. Так что Audi и Ford покажут cust_id 1, потому что оба цвета находятся в таблице2. Но для VW Table1 должен быть синий и черный – gregdanish

0

Думаю, я решил это, слегка изменил критерии RIGHT JOIN и, похоже, работает с тестами, которые я провел.

SELECT b.Cust_Id, 
     b.Car 
FROM Table1 a 
RIGHT JOIN 
(
    SELECT b.Cust_ID, a.Car, a.Colour 
    FROM Table2 a, Table1 b 
    ) b 
    ON a.Car = b.Car  AND 
     a.Colour = b.Colour AND 
     a.Cust_ID = b.Cust_ID 
GROUP BY b.Cust_Id, 
     b.Car 
HAVING SUM(CASE WHEN a.Colour IS NULL THEN 1 ELSE 0 END) = 0 
1

Немного поздно это как я вижу, у вас уже есть решение, но вот некоторые SQL я пришел в случае, если он может быть полезен. То, как я прочитал вопрос, стол1 может быть списком пожеланий автомобилей от разных клиентов, а таблица2 - списком дилеров, которые они могут предоставить. Дилер хочет знать, какие клиенты заинтересованы в их полном спектре цветов для каждого автомобиля:

select w.cust_id, w.car 
from table1 w join table2 s 
    on w.car=s.car and w.colour=s.colour 
group by w.cust_id, w.car 
having count(s.car)=(select count(*) from table2 where car=w.car); 
+0

Спасибо. Также, похоже, работает. :) – gregdanish