【问题标题】:Use two JOINs on the same table in sql query在 sql 查询中对同一张表使用两个 JOIN
【发布时间】:2014-05-08 02:48:54
【问题描述】:

我有一个类似下面的查询,它工作正常。

SELECT 
    "A".id AS A_id,
    "B".id AS B_id,
    "C".id AS C_id,
    "D".id AS D_id,
    "E".id AS E_id,
    "F".id AS F_id,
    "G".id AS G_id,
    "H".id AS H_id,
    "I".id AS I_id
FROM "A" 
INNER JOIN "B" ON "A".id = "B".A_id 
INNER JOIN "C" ON "B".C_id = "C".id
INNER JOIN "D" ON "C".D_id = "D".id
INNER JOIN "E" ON "D".id = "E".D_id
INNER JOIN "F" ON "E".F_id = "F".id
INNER JOIN "G" ON "F".G_id = "G".id
INNER JOIN "H" ON "G".id = "H".G_id
INNER JOIN "I" ON "H".I_id = "I".id;

现在我想添加特殊条件。表“B”与另一个表连接 我必须添加特殊加入(完全加入),但毕竟加入。像下面的东西 (当然不行):

SELECT 
    "A".id AS A_id,
    "B".id AS B_id,
    "C".id AS C_id,
    "D".id AS D_id,
    "E".id AS E_id,
    "F".id AS F_id,
    "G".id AS G_id,
    "H".id AS H_id,
    "I".id AS I_id,
    "Setup".id AS setup_id,
    "Run".id AS run_id
FROM "A" 
INNER JOIN "B" ON "A".id = "B".A_id 
INNER JOIN "C" ON "B".C_id = "C".id
INNER JOIN "D" ON "C".D_id = "D".id
INNER JOIN "E" ON "D".id = "E".D_id
INNER JOIN "F" ON "E".F_id = "F".id
INNER JOIN "G" ON "F".G_id = "G".id
INNER JOIN "H" ON "G".id = "H".G_id
INNER JOIN "I" ON "H".I_id = "I".id

AND FROM
"Setup" 
FULL JOIN "Run" ON "Setup".id = "Run".id
FULL JOIN "B" ON "Setup".id = "B".id;

我使用了完全连接,因为“运行”和“设置”表中的每一个都只包含一行,但与表“B”相连,该表有不止一行,我希望将它们全部放在结果表中.

如何修复?也许尝试在选择中使用选择?

【问题讨论】:

  • 我不明白。每个 B 音轨只有一个设置记录吗?每个设置记录只有一个运行记录?然后只需使用内部连接就可以了。
  • 你可能需要LEFT JOIN这些表,而不是完全连接。

标签: sql postgresql join inner-join jointable


【解决方案1】:

您不需要完全联接来获得反映在您描述的一对多关系中的多行。另一个内部连接。并且没有“AND FROM”结构。您可以直接添加连接。

INNER JOIN "I" ON "H".I_id = "I".id
INNER JOIN "Setup" ON "B".id = "Setup".id;
INNER JOIN "Run" ON "Setup".id = "Run".id

您可能应该阅读joins

[编辑]

评论表明数据是不对称的,因此您确实需要外连接,所以:

INNER JOIN "I" ON "H".I_id = "I".id
LEFT JOIN "Setup" ON "B".id = "Setup".id;
LEFT JOIN "Run" ON "Setup".id = "Run".id

【讨论】:

  • 我认为他需要左连接。
  • 我第一次这么认为,但是当我仔细阅读它时,我认为它实际上只是内部连接。我可能是错的。
  • 我可以使用 LEFT 或 FULL 连接。以上答案对我有帮助。 INNER JOIN 的结果是` tombinput_id | setup_id | run_id --------------+----------+-------- 1 | 1 | 1` 与 FULL 或 LEFT JOIN 是 ` tombinput_id | setup_id | run_id --------------+----------+-------- 4 | | 1 | 1 | 1 2 | | 3 | | ` 在选择中没有某些字段以更透明的视图。
  • 如果您在一侧或另一侧“缺少”相关列,则需要一个 OUTER JOIN(左或右)。这听起来像是设置和运行记录将存在的描述,因此在这种情况下会使用 INNER。之前的 cmets 中的数据证明并非如此。一个 FULL OUTER 结合了 LEFT 和 RIGHT 连接,但我们给出的结果与其中一个或另一个相同,具体取决于是否缺少什么。
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多