TSQL按组查找不在另一个列表中的项目
TSQL to find items not in another list by group
我有 2 个 table 如下:
| 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
我希望每组 "outer join" 他们得到以下结果
| 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
基本上是按组查找 table 2 中与 table 1 中不匹配的每个值,在这种情况下是第 1 列。
我最初尝试加入 2 tables 似乎并没有产生我想要的结果,例如:
SELECT * FROM
Table1 T1
FULL OUTER JOIN Table2 T2 on t1.Column2 = t2.Column1
where t1.column1 is null
这应该可以满足您的需要:
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
先生成所有组合,然后先左连接table找出缺少的内容:
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
此外,您可以使用 EXCEPT
:
SELECT DISTINCT t1.c1
,t2.c1
FROM @t1 t1
CROSS APPLY @t2 t2
EXCEPT
SELECT *
FROM @t1
我有 2 个 table 如下:
| 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
我希望每组 "outer join" 他们得到以下结果
| 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
基本上是按组查找 table 2 中与 table 1 中不匹配的每个值,在这种情况下是第 1 列。
我最初尝试加入 2 tables 似乎并没有产生我想要的结果,例如:
SELECT * FROM
Table1 T1
FULL OUTER JOIN Table2 T2 on t1.Column2 = t2.Column1
where t1.column1 is null
这应该可以满足您的需要:
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
先生成所有组合,然后先左连接table找出缺少的内容:
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
此外,您可以使用 EXCEPT
:
SELECT DISTINCT t1.c1
,t2.c1
FROM @t1 t1
CROSS APPLY @t2 t2
EXCEPT
SELECT *
FROM @t1