【问题标题】:sql join tables with same column namessql连接具有相同列名的表
【发布时间】:2016-03-24 12:56:49
【问题描述】:

有表 1 和表 2,我如何加入它们并创建表 3?似乎无论是 left join 还是 union all 都可以解决问题。 谢谢!

表1

Key Var1 Var2

1    A    AA
2    B  
3    C  
4         DD
5         EE

表2

Key Var1 Var2
3    C    CC
4    D    DD
5    E    EE
6    F    FF
7    G    GG

表3

Key Var1 Var2
1    A    AA
2    B  
3    C    CC
4    D    DD
5    E    EE

【问题讨论】:

  • Key=6 和 Key=7 行在输出中的什么位置?
  • key=6 和 7 是输出中不需要的行。
  • 非常酷!最佳答案(Gordon 和 Juergen)和 Vishant 的答案都有效。有什么更高效的想法吗?

标签: sql sas


【解决方案1】:

使用返回第一个非空值的coalesce()

select t1.key,
       coalesce(t1.var1, t2.var1) as var1,
       coalesce(t1.var2, t2.var2) as var2
from table1 t1 
left join table2 t2 on t1.key = t2.key

【讨论】:

  • 假设空格是空值,而不仅仅是空字符串。
  • @MatRichardson 这就是有趣的地方! NULLIF(t1.var1, '')
【解决方案2】:

先前的答案实际上无法正常工作,因为它使用了内部连接:

select * from t1 where t1.key not in (select distinct key from t2) 
UNION
select * from t2 where key not in (select distinct key from t1)
UNION
select t1.key,
   coalesce(t1.var1, t2.var1) as var1,
   coalesce(t1.var2, t2.var2) as var2
from table1 t1
join table2 t2 on t1.key = t2.key

【讨论】:

    【解决方案3】:

    下面的代码将在 SAS 中完成,

    /* The steps to create table 1 and 2 can be skipped if the Tables exist */
    data table1;
      infile datalines dsd dlm=' ' missover;
      input Key Var1 $ Var2 $;
      datalines;
      1 A AA
      2 B  
      3 C  
      4  DD
      5  EE
      ;
    run;
    
    data table2;
      infile datalines  dsd dlm=' ' missover;
      input Key Var1 $ Var2 $;
      datalines;
      3 C CC
      4 D DD
      5 E EE
      6 F FF
      7 G GG
      ;
    run;
    
    /* Sort the Dataset T1 and T2 */
    proc sort data=table1; by key; run;
    proc sort data=table2; by key; run;
    
    /* Final Output */
    data want;
      merge table1(in=t1) table2(in=t2);
      by key;
      if t1; /* Keep only the records in Table 1 */
    run;
    

    【讨论】:

      【解决方案4】:

      于尔根一针见血。 但是,如果您正在处理空字符串而不是 null 替换 如果(长度(t1.var1)> 0,t1.var1,t2,var1)作为var1, if(length(t1.var2) > 0, t1.var2,t2,var2) as var2,

      coalesce 是首选方法。长度检查较慢

      【讨论】:

        【解决方案5】:

        我重新创建了您的问题并编写了此查询...

        DECLARE @ta table (
        id int,
        var1 nvarchar(3),
        var2 nvarchar(3)
        )
        
        DECLARE @tb table(
        id int,
        var1 nvarchar(3),
        var2 nvarchar(3))
        
        INSERT INTO @ta VALUES (1,'A','AA')
        INSERT INTO @ta VALUES (2,'B','')
        INSERT INTO @ta VALUES (3,'C','')
        INSERT INTO @ta VALUES (4,'','DD')
        INSERT INTO @ta VALUES (5,'','EE')
        
        INSERT INTO @tb VALUES (3,'C','CC')
        INSERT INTO @tb VALUES (4,'D','DD')
        INSERT INTO @tb VALUES (5,'E','EE')
        INSERT INTO @tb VALUES (6,'F','FF')
        INSERT INTO @tb VALUES (7,'G','GG')
        
        SELECT id, var1, var2 from @ta where id <> (
        SELECT a.id from @ta AS a INNER JOIN @tb AS b on a.var1 = b.var1)
        AND var1 <> '' 
        UNION 
        SELECT id, var1, var2 from @tb
        

        我等一下,这段代码可以帮助你...

        【讨论】:

          猜你喜欢
          • 2021-07-08
          • 2012-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 2013-04-19
          • 1970-01-01
          相关资源
          最近更新 更多