Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL是连接所有值都存在的表的有效方法_Sql_Sql Server_Tsql - Fatal编程技术网

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

SQL是连接所有值都存在的表的有效方法,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想找到同时包含765和656的所有组-在本例中,GroupC同时包含这两个值 有没有办法避免一堆嵌套的查询或AND语句? 假设表1可以有数千对,我必须找到包含30项列表中所有项的组 写一个非常大的问题来回答这个问题是很难看的 我希望我能说“where in(765656)”,但让它表现得不同。如果有一堆东西要搭配,它会变得一团糟 SQL小提琴 示例数据(如果由于某种原因无法访问SQL FIDLE): 最简单的方法是使用分组方式和拥有: create table table1(itemID in

我想找到同时包含765和656的所有组-在本例中,GroupC同时包含这两个值

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

我希望我能说“where in(765656)”,但让它表现得不同。如果有一堆东西要搭配,它会变得一团糟

SQL小提琴

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


最简单的方法是使用
分组方式
拥有

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');

可以使用“相交”操作符。INTERSECT从两个表返回共享的不同值。在实践中,我发现这比其他方法更快

在本例中,我将intersect放在以下查询之间:

SELECT DISTINCT t1.group_name 
                    FROM table1 t1 join table1 t2 join groups g
                        ON t1.group_id = t2.group_id 
                           and t1.item = 765 
                           and t2.item = 656
                           and g.group_id = t1.group_id
提供输出:

SELECT T2.groupName 
  FROM table1 T1 INNER JOIN table2 T2 ON T1.groupID = T2.groupID
 WHERE T1.itemID = 765

INTERSECT 

SELECT T2.groupName 
  FROM table1 T1 INNER JOIN table2 T2 ON T1.groupID = T2.groupID
 WHERE T1.itemID = 656

值列表是什么(例如
765656
)?一张桌子?逗号分隔的字符串?另一个查询的结果是什么?还有别的吗?我最喜欢这个。其他人建议你列出所有项目的清单。我从来没有想过使用计数(独特的…独特的部分是聪明的!
SELECT DISTINCT t1.group_name 
                    FROM table1 t1 join table1 t2 join groups g
                        ON t1.group_id = t2.group_id 
                           and t1.item = 765 
                           and t2.item = 656
                           and g.group_id = t1.group_id
SELECT T2.groupName 
  FROM table1 T1 INNER JOIN table2 T2 ON T1.groupID = T2.groupID
 WHERE T1.itemID = 765

INTERSECT 

SELECT T2.groupName 
  FROM table1 T1 INNER JOIN table2 T2 ON T1.groupID = T2.groupID
 WHERE T1.itemID = 656
groupName
---------
groupC