【发布时间】:2015-08-05 07:09:40
【问题描述】:
我遇到了从LEFT JOIN 获得重复值的情况。我认为这可能是一种理想的行为,但与我想要的不同。
我有三个表:person、department和contact。
人:
id bigint,
person_name character varying(255)
部门:
person_id bigint,
department_name character varying(255)
联系方式:
person_id bigint,
phone_number character varying(255)
Sql 查询:
SELECT p.id, p.person_name, d.department_name, c.phone_number
FROM person p
LEFT JOIN department d
ON p.id = d.person_id
LEFT JOIN contact c
ON p.id = c.person_id;
结果:
id|person_name|department_name|phone_number
--+-----------+---------------+------------
1 |"John" |"Finance" |"023451"
1 |"John" |"Finance" |"99478"
1 |"John" |"Finance" |"67890"
1 |"John" |"Marketing" |"023451"
1 |"John" |"Marketing" |"99478"
1 |"John" |"Marketing" |"67890"
2 |"Barbara" |"Finance" |""
3 |"Michelle" |"" |"005634"
我知道这是连接的作用,保持与选定行相乘。但它给人的感觉就像电话号码023451,99478,67890 是针对两个部门的,而它们仅与人员 john 相关,具有不必要的重复值,这会随着更大的数据集而升级问题。
所以,这就是我想要的:
id|person_name|department_name|phone_number
--+-----------+---------------+------------
1 |"John" |"Finance" |"023451"
1 |"John" |"Marketing" |"99478"
1 |"John" |"" |"67890"
2 |"Barbara" |"Finance" |""
3 |"Michelle" |"" |"005634"
这是我的情况示例,我正在使用大量表和查询。所以,需要一个通用的解决方案。
【问题讨论】:
-
防止任何内部或左连接的重复是通过正确连接多重性来处理的(并在开始时让它们正确!)。当前显示的结果是“正确的” - 否则信息将丢失。
-
您想要的结果绝对是任意的,因为架构中的联系人和部门之间没有关系
-
@Beginner-postgres 数据库。有关系吗 ?它的基本sql对吗?
-
@ᴳᵁᴵᴰᴼ 我知道这有点武断,但结果会产生很多冗余。任何有助于达到我想要的结果。我需要为此更改架构吗?
-
你怎么知道
Finance的电话号码是023451我看不出dept 和contact 之间有什么关系。