【问题标题】:Joining two tables where some columns merge and others must be null连接两个表,其中某些列合并,其他列必须为空
【发布时间】:2018-12-10 00:56:52
【问题描述】:

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


我有三个这样的表:

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

而 things2 看起来像这样:

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 放在任何字段中,而是将它们全部组合在一起 - 我敢肯定,当您阅读查询时,您可能会想到更多的 SQL:D

无论如何。这就是我所在的地方。任何帮助都将不胜感激。

【问题讨论】:

    标签: sql postgresql join outer-join


    【解决方案1】:

    你似乎想要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;
    

    【讨论】:

    • 我注意到您的第一个答案的执行速度大约是已编辑答案的两倍。你知道为什么/什么会导致这种情况,或者为什么编辑会比原来的更好吗?
    • 在使用 EXPLAIN 运行两个版本后,当我不使用 JOIN 但未将它们与 JOIN 一起使用时,它看起来正在使用索引。我只能想象这是由于我的测试表中的行数很少,postgresql 对优化做出了某种假设。感谢您的回答。这将使我朝着正确的方向开始。
    • @FrankJosephMattia 。 . .第一个答案没有使用users 表进行过滤。这似乎是您问题的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多