【问题标题】:MySQL union/full outer join not returning expected resultsMySQL联合/完全外连接不返回预期结果
【发布时间】:2018-04-22 15:06:47
【问题描述】:

我有 2 个表格,其中一个列出人员及其与财产的关系,还有一个包含财产列表(名字、姓氏等)的表格。

人员表中的每个人可能不具有属性表中列出的所有属性。我想要的是每个人都为每个属性返回一行,无论他们是否有链接。

例如

Properties              Person
prop_id|prop_name       person_id|prop_id|prop_value
-----------------       -----------------------------------
1      |firstname        10      | 1            | john
2      |lastname         11      | 1            | sean
                         11      | 2            | connery

我想要的结果是这样的

10 | firstname | john
10 | lastname  | null
11 | firstname | sean
11 | lastname  | connery

请注意,john/10 有一个姓氏行,但为空。

我认为这个查询会给我结果,但它没有给我想要的 john 空行。

select person_id, prop_value, prop_name
from person
left outer join properties on person.prop_id = properties.prop_id
union
select person_id, prop_value, prop_name
from person
right outer join properties on person.prop_id = properties.prop_id

此查询省略了 10 lastname 空行。这个查询可以吗?这是 MySQL/MariaDB。

【问题讨论】:

    标签: mysql union full-outer-join


    【解决方案1】:

    我认为您想将person 表加入properties 表两次以使其正常工作。可能是这样的:

    SELECT DISTINCT p1.person_id, p2.prop_value, prop.prop_name
    FROM person p1
      CROSS JOIN properties prop
      LEFT JOIN person p2 ON p1.person_id = p2.person_id AND prop.prop_id = p2.prop_id
    

    这是在@RomainBar 的sqlfiddle.com/#!9/3dadb90/7 中演示的工作

    【讨论】:

    • 如果您将DISTINCT 添加到@cf_en 查询中,它将起作用:sqlfiddle.com/#!9/3dadb90/7 如果您不使用 2 个连接,您不能让 person_id 不为 null 和 prop_value null,因为它们来自同桌
    • 感谢关于 distinct 和 sqlfiddle 的说明。我已将DISTINCT 添加到答案中。
    猜你喜欢
    • 2017-06-09
    • 2015-11-01
    • 2017-01-20
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多