Как я могу написать запрос для сопоставления групп записей - PullRequest
0 голосов
/ 17 мая 2018

Это загадочная задача SQL. Я хотел бы сделать это с помощью запроса вместо того, чтобы переходить курсором и делать это «трудным путем».

Если у меня есть две таблицы TableA и TableB, каждая со столбцом группировки, как показано ниже:

TableA             TableB
-------------      -------------
id     group       id     group
------ ------      ------ ------
1      D           1      X
2      D           2      X
3      D           3      Y
4      D           4      Y
4      E           5      Y
5      E           5      Z
5      F           6      Z

Обратите внимание, что имена групп не то же имя.

Я хочу знать, состоит ли данная группа TableB полностью из идентификаторов, которые также сгруппированы в любой группе в TableA. Группа TableA может иметь больше идентификаторов, чем группа TableB, если она имеет все те же идентификаторы, что и группа TableB. Идентификаторы могут входить в несколько групп в любой таблице.

Из приведенных выше таблиц я должен выяснить, что группа X из Таблицы B соответствует группе в Таблице A, а группы Y и Z - нет.

Я пробовал много разных запросов, подзапросов, рекурсивных CTE. Я только закончил с неправильными результатами и головными болями. Реальный набор данных значительно больше, поэтому производительность тоже следует учитывать. К сожалению, это означает, что решение перекрестного соединения, предложенное в ответе ниже, не будет работать.

Возможно ли это даже с SQL?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Этот запрос может дать ответ.

SELECT B.[group] 
FROM 
   TableB B
   FULL JOIN TableA A ON B.id = A.id
GROUP BY 
   B.[group]
HAVING 
   COUNT(DISTINCT A.[group]) = 1
0 голосов
/ 17 мая 2018

Идея этого запроса - рассмотреть каждую группу для каждой другой группы. Затем посчитайте количество совпадений идентификаторов. Это включает cross join для генерации всех пар групп, затем некоторые объединения и агрегацию:

select b.group, a.group
from (select group, count(*) as cnt b group by group) bg cross join
     (select distinct group a) ag left join
     b
     on b.group = bg.group left join
     a
     on a.group = ag.group and a.id = b.id
group by bg.group, ag.group, bg.cnt
having bg.cnt = count(a.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...