【问题标题】:TSQL to find items not in another list by groupTSQL按组查找不在另一个列表中的项目
【发布时间】: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

【问题讨论】:

    标签: tsql group-by outer-join


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-08
          • 2012-07-10
          • 2017-06-06
          • 2022-11-12
          • 1970-01-01
          • 1970-01-01
          • 2016-06-18
          • 2013-03-11
          相关资源
          最近更新 更多