TSQL按组查找不在另一个列表中的项目

Posted

技术标签:

【中文标题】TSQL按组查找不在另一个列表中的项目【英文标题】:TSQL to find items not in another list by group 【发布时间】:2017-06-02 14:30:05 【问题描述】:

我有 2 个表如下:

| Table 1             | Table 2
| Column 1 | Column 2 | Column 1    
|----------|----------|---------
|c1        |v1        | v1
|c1        |v2        | v2
|c1        |v4        | v3
|c2        |v2        | v4
|c2        |v7        | v5
|c3        |v1        | v6
|c3        |v3        | v7
|c3        |v4        
|c3        |v6        

我想按组“外部加入”它们以获得以下结果

 | Column 1 | Column 2
 |----------|---------
 |c1        |v3       
 |c1        |v5       
 |c1        |v6
 |c1        |v7                 
 |c2        |v1       
 |c2        |v3      
 |c2        |v4       
 |c2        |v5      
 |c2        |v6           
 |c3        |v2     
 |c3        |v5       
 |c3        |v7       

基本上是按组查找表 2 中与表 1 中不匹配的每个值,在这种情况下是第 1 列。

我最初尝试加入 2 个表似乎并没有产生我想要的结果,例如:

SELECT * FROM 
Table1 T1
FULL OUTER JOIN Table2 T2 on t1.Column2 = t2.Column1
where t1.column1 is null

【问题讨论】:

【参考方案1】:

这应该可以满足您的需要:

declare @t1 table(c1 nvarchar(5),c2 nvarchar(5));
declare @t2 table(c1 nvarchar(5));

insert into @t1 values ('c1','v1'),('c1','v2'),('c1','v4'),('c2','v2'),('c2','v7'),('c3','v1'),('c3','v3'),('c3','v4'),('c3','v6');

insert into @t2 values ('v1'),('v2'),('v3'),('v4'),('v5'),('v6'),('v7');

select ta.c1
        ,t2.c1 as c2
from @t2 t2
    cross apply (select distinct c1 from @t1) ta
    left join @t1 t1
        on(t2.c1 = t1.c2
            and ta.c1 = t1.c1
            )
where t1.c1 is null
order by ta.c1
        ,ta.c1;

输出:

c1  c2
------
c1  v3
c1  v5
c1  v6
c1  v7
c2  v1
c2  v3
c2  v4
c2  v5
c2  v6
c3  v2
c3  v5
c3  v7

【讨论】:

【参考方案2】:

首先生成所有组合,然后在第一个表上左连接以找出缺少的内容:

select distinct t1.c1, t2.c1 
from @t1 t1 
cross join @t2 t2
left join @t1 t on t1.c1 = t.c1 and t2.c1 = t.c2
where t.c1 is null

【讨论】:

【参考方案3】:

另外,你可以使用EXCEPT:

SELECT DISTINCT t1.c1
               ,t2.c1
FROM @t1 t1
CROSS APPLY @t2 t2
EXCEPT
SELECT *
FROM @t1

【讨论】:

以上是关于TSQL按组查找不在另一个列表中的项目的主要内容,如果未能解决你的问题,请参考以下文章

TSQL查找组中的所有记录是不是具有相同的值

根据不同类型的另一个列表中的项目查找一个列表中的项目

数据重复时如何按组查找最小日期

c# 在 LINQ 查询返回的列表中查找项目并将其值与列表中的另一个项目进行比较

linq - 您如何查询一个查询源中不在另一个查询源中的项目?

从一个数组中删除另一个数组中的值