Есть два набора сотрудников: менеджеры и ворчание.
Для каждого менеджера есть таблица manager_meethings, в которой содержится список встреч, на которых присутствовал каждый менеджер. Аналогичная таблица grunt_meetings содержит список встреч, на которых присутствовал каждый хрюканье.sql select records with matching subsets
Итак:
manager_meetings grunt_meetings
managerID meetingID gruntID meetingID
1 a 4 a
1 b 4 b
1 c 4 c
2 a 4 d
2 b 5 a
3 c 5 b
3 d 5 c
3 e 6 a
6 c
7 b
7 a
Владелец не нравится, когда менеджер и хрюкать знаю точно такую же информацию. У него болит голова. Он хочет идентифицировать эту ситуацию, поэтому он может понизить репутацию менеджера до ворчания или рекламировать менеджера, или взять их в гольф. Владелец любит играть в гольф.
Задача состоит в том, чтобы перечислить каждую комбинацию менеджера и хрюкать, где оба присутствовали на одних и тех же собраниях. Если менеджер посещал больше встречи, чем ворчание, не совпадало. Если хрюканье посещало больше встреч, чем менеджер, не было ни одного матча.
Ожидаемые результаты здесь:
ManagerID GruntID
2 7
1 5
... потому что менеджер 2 и хрюкать 7 и присутствовал (а, б), в то время как менеджер 1 и хрюкать 5 оба посетили (а, б, в).
Я могу решить это неуклюже, путем подбора подмножества встреч в подзапросе в XML и сравнения каждого XML-списка grunt с XML каждого менеджера. Но это ужасно, и я должен объяснить владельцу, что такое XML. И мне не нравится играть в гольф.
Есть ли лучший способ сделать "WHERE {subset1} = {subset2}"
? Похоже, я пропустил какой-то умный вид.
Ну, +1 для SQL Fiddle, интересная история назад, попытка решить ее самостоятельно и сложный вопрос. Если бы все вопросы были такими тщательными! –
О, но -1 для [использования 'char' без длины] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without- length.aspx). :-) –
Без длинного объявления char в моем производственном коде, я обещаю! Взял пару ярлыков, скрывая код. – SteveSmithSQL