仅当数据匹配或SQL中一个为NULL时才汇总行

时间:2018-08-16 07:26:57

标签: sql snowflake

仅当所有列都匹配,或者不匹配的列归因于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被合并,同时保留t1t2中的其他行没有匹配项。

这可以通过COALESCE和FULL JOIN或其他任何方式来实现吗?

2 个答案:

答案 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