连接两个表,其中某些列合并而其他列必须为空

时间:2018-07-01 17:03:26

标签: sql postgresql join outer-join

我觉得这个问题一定已经在某个地方回答了,但是我的搜索没有发现任何相关的内容。如果任何人都可以链接到另一个答案,我可以接受将其标记为重复并关闭。


我有三个这样的表:

users(id)
things1(id, user_id, thing1_text)
things2(id, user_id, thing2_text)

在此示例中,假设users表中只有一个用户,其中id1

假设things1看起来像这样:

id
1
2
user_id
1
1
thing1_text
im a thing 1
im a thing 1 too

事物2看起来像这样:

id
1
2
user_id
1
1
thing2_text
im a thing 2
im a thing 2 too

我正在尝试创建查询,该查询将返回以下内容:

user_id
1
1
1
1
thing1_text
im a thing 1
im a thing 1 too
NULL
NULL
thing2_text
NULL
NULL
im a thing 2
im a thing 2 too

我的第一次尝试,天真的尝试是这样的:

select users.id as user_id
     , things1.thing1_text
     , things2.thing2_text
from users
full outer join things1
    on things1.user_id = users.id
full outer join things2
    on things2.user_id = users.id;

但是,这并没有将NULL放在任何字段中,而是将它们全部组合了-我敢肯定,当您阅读查询:D时,您可能会发现其中更多的SQL想法

无论如何。这就是我的位置。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您似乎想要union all。从此开始:

select user_id, thing1_text, thing2_text
from ((select user_id, thing1_text, NULL as thing2_text
       from things1 t1 join
            users u
            on t1.user_id = u.id
      ) union all
      (select user_id, NULL, thing2_text
       from things2 t2 join
            users u
            on t2.user_id = u.id
      )
     ) tt
order by user_id;