SQL 具有缺失值的 Postgres 联合数据

SQL Postgres union data with missed values

我有两个查询结果:

id  |  col1  |  col2  |  col3
1     1           null       3j
2     2           12         35
3     null        32         31
4     null        43         33
5     null        44         4
id  |  col1  |  col2  |  col3
6     1        null      3j
7     2        null      35
8     3        null      31
9     4        null      33
10    5        null      null

我需要合并:

id  |  col1  |  col2  |  col3
6     1        null      3j
7     2        12        35
8     3        32        31
9     4        43        33
10    5        null      null
5     null     44        4

问题是缺少一些值

我写了这个大 sql 查询来解决这个问题:

select *
from (
         select max(id)   as id,
                max(col1) as col1,
                max(col2) as col2,
                max(col3) as col3
         from (
                  select max(id)   as id,
                         max(col1) as col1,
                         max(col2) as col2,
                         max(col3) as col3
                  from (
                           select max(id)   as id,
                                  max(col1) as col1,
                                  max(col2) as col2,
                                  max(col3) as col3
                           from (
                                    select *
                                    from t1
                                    where id = 1
                                    union
                                    select *
                                    from t2
                                    where id = 2
                                ) t
                           group by case
                                        when col1 is null
                                            or
                                             length(col1) =
                                             0 then id
                                        else col1 end
                       ) t1
                  group by case
                               when col2 is null
                                   or length(col2) = 0
                                   then id
                               else col2 end
              ) t2
         group by case
                      when col3 is null
                          or length(col3) = 0 then id
                      else col3 end
     ) t3

可能有一些想法可以简化它?还是有其他方法可以有效地丰富数据,因为我还需要做交集、右、左、内联合,我不想构建如此怪物查询

好吧,你猫试试这样的东西: 工会

select max(col1),
       max(col2),
       max(col3)
from t1
where id = 1
   or id = 2
group by coalesce(nullif(col1, ''),
                  nullif(col2, ''),
                  nullif(col3, ''));

更新: 外联合

select max(col1),
       max(col2),
       max(col3)
from t1
where id = 1
   or id = 2
group by coalesce(nullif(col1, ''),
                  nullif(col2, ''),
                  nullif(col3, ''))
having count = 1;

内部联盟

select max(col1),
       max(col2),
       max(col3)
from t1
where id = 1
   or id = 2
group by coalesce(nullif(col1, ''),
                  nullif(col2, ''),
                  nullif(col3, ''))
having count > 1;

left 和 right 与 'where'

的常见查询外交