仅当所有列都匹配,或者不匹配的列归因于NULL时,我才想合并表
例如,如果我要联接如下所示的表t1
:
id | column1 | column2 | column3
----+---------+---------+---------
A | NULL | 1 | NULL
B | NULL | 3 | v5
C | v6 | NULL | NULL
到表t2
如下:
id | column1 | column2 | column3
----+---------+---------+---------
A | v1 | 1 | v2
A | NULL | 2 | v3
B | v4 | NULL | NULL
C | v7 | 4 | v8
我希望生成的目标表为:
id | column1 | column2 | column3
----+---------+---------+---------
A | v1 | 1 | v2
A | NULL | 2 | v3
B | v4 | 3 | v5
C | v6 | NULL | NULL
C | v7 | 4 | v8
将t1
中的row1和t2
中的row1合并为 ,而t1
中的row2和t2
中的row3被合并,同时保留t1
和t2
中的其他行没有匹配项。
这可以通过COALESCE和FULL JOIN或其他任何方式来实现吗?
答案 0 :(得分:1)
嗯。 。 。如果我理解正确,那么在执行NULL
时,您想将JOIN
视为通配符。因此,任一表中的NULL
都将与另一表中的任何值匹配。
如果是这样,则所有列上的FULL JOIN
(具有正确的逻辑)应该可以满足您的要求:
select t1.id,
coalesce(t2.col1, t1.col1) as col1,
coalesce(t2.col2, t1.col2) as col2,
coalesce(t2.col3, t1.col3) as col3
from t1 full join
t2
on t1.id = t2.id and
(t1.col1 = t2.col1 or t1.col1 is null or t2.col1 is null) and
(t1.col2 = t2.col2 or t1.col2 is null or t2.col2 is null) and
(t1.col3 = t2.col3 or t1.col4 is null or t2.col3 is null);
答案 1 :(得分:0)
尝试使用完全外部联接和COALESCE
select table1.id,COALESCE(table1.column1, table2.column1) as column1,
COALESCE(table1.column2, table2.column2) as column2,
COALESCE(table1.column3, table2.column3) as column3 from table1
full outer join table2 on table1.id=table2.id