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

时间:2018-07-24 16:44:25

标签: sql sql-server tsql

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

我想找到所有包含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');

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用INTERSECT运算符。 INTERSECT返回两个表中共享的不同值。实际上,我发现它比其他方法更快。

在此示例中,我在以下查询之间插入了相交:

<tbody>
{rows.map((row,i) => {
                return(
                    <tr key={i}>
                        <td scope="row" >{i}</td>
                        <td>{row.ex}</td>
                        <td>{row.ex}</td>
                        <td>{row.ex}</td>
                        <td>{row.ex}</td>
                        <td>{row.ex}</td>
                        <td>
                            this is the delete button
                        </td>
                    </tr>
                );
            })}
</tbody>

提供输出:

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