sql – 防止LEFT JOIN中的重复值

前端之家收集整理的这篇文章主要介绍了sql – 防止LEFT JOIN中的重复值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到了从LEFT JOIN获得重复值的情况.我认为这可能是一种理想的行为,但与我想要的不同.

我有三张桌子:人,部门和联系人.

人:

  1. id bigint,person_name character varying(255)

部 :

  1. person_id bigint,department_name character varying(255)

联系 :

  1. person_id bigint,phone_number character varying(255)

SQL查询

  1. SELECT p.id,p.person_name,d.department_name,c.phone_number
  2. FROM person p
  3. LEFT JOIN department d
  4. ON p.id = d.person_id
  5. LEFT JOIN contact c
  6. ON p.id = c.person_id;

结果:

  1. id|person_name|department_name|phone_number
  2. --+-----------+---------------+------------
  3. 1 |"John" |"Finance" |"023451"
  4. 1 |"John" |"Finance" |"99478"
  5. 1 |"John" |"Finance" |"67890"
  6. 1 |"John" |"Marketing" |"023451"
  7. 1 |"John" |"Marketing" |"99478"
  8. 1 |"John" |"Marketing" |"67890"
  9. 2 |"Barbara" |"Finance" |""
  10. 3 |"Michelle" |"" |"005634"

我知道这是联接做的事情,保持与所选行相乘.但是它给出了两个部门的电话号码023451,99478,67890的意义,而它们只与人约翰有关,不必要的重复值会使更大的数据集升级问题.
所以,这就是我想要的:

  1. id|person_name|department_name|phone_number
  2. --+-----------+---------------+------------
  3. 1 |"John" |"Finance" |"023451"
  4. 1 |"John" |"Marketing" |"99478"
  5. 1 |"John" |"" |"67890"
  6. 2 |"Barbara" |"Finance" |""
  7. 3 |"Michelle" |"" |"005634"

这是我的情况的一个示例,我正在使用大量的表和查询.所以,需要一种通用的解决方案.

解决方法

我喜欢称这个问题为“通过代理交叉加入”.由于没有信息(WHERE或JOIN条件)表部门和联系人应该如何匹配,他们通过代理表人交叉加入 – 给你 Cartesian product.非常类似于这个:

> Two SQL LEFT JOINS produce incorrect result

那里有更多解释.

您的查询解决方案:

  1. SELECT p.id,c.phone_number
  2. FROM person p
  3. LEFT JOIN (
  4. SELECT person_id,min(department_name) AS department_name
  5. FROM department
  6. GROUP BY person_id
  7. ) d ON d.person_id = p.id
  8. LEFT JOIN (
  9. SELECT person_id,min(phone_number) AS phone_number
  10. FROM contact
  11. GROUP BY person_id
  12. ) c ON c.person_id = p.id;

您没有定义要选择的部门或电话号码,因此我随意选择了第一个部门或电话号码.你可以用任何其他方式……

猜你在找的MsSQL相关文章