繁体   English   中英

sql联接具有相同列名的表

[英]sql join tables with same column names

有表1和表2,如何加入它们并创建表3? 似乎无论是左加入还是联合都不能解决问题。 谢谢!

表格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

使用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

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

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

以下代码将在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;

Juergen击中了头部。 但是,如果您正在处理空字符串而不是null替代if(length(t1.var1)> 0,t1.var1,t2,var1)作为var1,if(length(t1.var2)> 0,t1.var2,t2 ,var2)作为var2,

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

我已经重新创建了您的问题,并写了这个查询...

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

我等待,此代码可以帮助您...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM