SQL有效的方法来连接所有值都存在的表

jaw*_*101 2 sql t-sql sql-server

table 1
item    group_id
123     aaaa
432     bbbb
534     aaaa
765     cccc
656     aaaa
656     cccc
111     cccc

group_id    group_name
aaaa        groupA
bbbb        groupB
cccc        groupC
Run Code Online (Sandbox Code Playgroud)

我想找到包含765和656的所有组 - 在这种情况下,GroupC包含这两个值.

有没有办法避免一堆嵌套查询或AND语句?假设表1可以有数千个配对,我必须找到包含所有30个项目列表的组.编写一个非常大的查询来回答这个问题会很难看.

我希望我能说"在(765,656)中的位置",但它的表现不同.如果有一堆物品要匹配就会变得混乱.

SQL小提琴http://sqlfiddle.com/#!9/6581eb/9

示例数据(如果SQL Fiddle由于某种原因无法访问):

create table table1(itemID int,groupID varchar(4));
insert into table1(itemID,groupID)
values
  (123,'aaaa')
  ,(432,'bbbb')
  ,(534,'aaaa')
  ,(765,'cccc')
  ,(656,'aaaa')
  ,(656,'cccc')
  ,(111,'cccc');

create table table2(groupID varchar(4),groupName varchar(6));
insert into table2(groupID,groupName)
values
  ('aaaa','groupA')
  ,('bbbb','groupB')
  ,('cccc','groupC');
Run Code Online (Sandbox Code Playgroud)

Zoh*_*led 10

最简单的方法是使用group byhaving:

SELECT group_name
FROM table2 g
JOIN table1 t on g.group_id = t.group_id
WHERE t.item in (765,656)
GROUP BY group_name
HAVING COUNT(DISTINCT t.item) = 2
Run Code Online (Sandbox Code Playgroud)