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