【问题标题】:Inner join 3 tables - show rows for ID that isn't found in other tables内连接 3 个表 - 显示在其他表中找不到的 ID 行
【发布时间】:2014-01-08 05:00:06
【问题描述】:

您好,我有 3 个表的内部联接

SELECT ADDRESS.NAME, ADDRESS.SURNAME, ADDRESS.PLACE,ADDRESS.TOTAL_COST_YEAR, ADDRESS.AREA, ISNULL(SUM(RENT.TO_PAY), 0) AS SumToPay, ISNULL(SUM(ORDER.AMOUNT), 0) AS SumPaid FROM ORDER
INNER JOIN ADDRESS
ON ADDRESS.IDadresa=ORDER.IDadresa
INNER JOIN RENT
on RENT.IDadresa = ORDER.IDadresa
GROUP BY ADDRESS.NAME, ADDRESS.SURNAME,ADDRESS.PLACE,ADDRESS.TOTAL_COST_YEAR,ADDRESS.AREA

它运行良好,但有时在表 ADDRESS 中的 IDadresa 下找到的值不包含其他表中的任何记录,但我仍然需要显示来自 ADDRESSES 的行。

我认为这是因为在 RENT 和 ORDER 列中没有该 ID 的任何记录。有人可以帮我改进这段代码吗?

感谢您的宝贵时间。

【问题讨论】:

  • 使用left outer join 而不是inner join 进行两个连接。您希望将所有内容都保留在 address 表中,因此将其设为序列中的第一个表并进行所有连接 left outer join
  • @GordonLinoff 谢谢你的评论,我应该在JOINS 中都使用LEFT OUTER JOIN 吗?当我这样做时,我会得到相同的结果。
  • 订单和地址之间右连接,地址和租金之间左连接
  • @wxyz 谢谢!效果很好,请将其作为答案发布,以便我接受。

标签: sql select join


【解决方案1】:

由于您每次都需要所有地址行,只需在订单和地址之间使用right join,在地址和租金之间使用left join

【讨论】:

  • 为什么推荐右连接而不是重新排序表以获得所有左连接?我认为你应该帮助初学者避免右连接。
【解决方案2】:

以下应该提供预期的结果:

SELECT a.NAME, a.SURNAME, a.PLACE,a.TOTAL_COST_YEAR, a.AREA, ISNULL(SUM(RENT.TO_PAY), 0) AS SumToPay, ISNULL(SUM(ORDER.AMOUNT), 0) AS SumPaid FROM ORDER
LEFT OUTER JOIN ADDRESS a
    ON a.IDadresa=ORDER.IDadresa
RIGHT OUTER JOIN RENT
    ON RENT.IDadresa = ORDER.IDadresa
GROUP BY a.NAME, a.SURNAME,a.PLACE,a.TOTAL_COST_YEAR,a.AREA

【讨论】:

  • 为什么推荐右连接而不是重新排序表以获得所有左连接?我认为你应该帮助初学者避免右连接。
  • @ErikE .. 我很想了解 Left over Right 连接的好处。请提供参考,因为快速搜索似乎与以下 SO 链接一致:stackoverflow.com/questions/7358084/…
  • 请澄清:您是表示不同意我的观点,还是不理解?
  • 我想我不完全理解 LEFT 相对于 RIGHT 连接的好处。在您最初发表评论后,我在网上搜索了一些资源以找到可以解释的资源,但大多数情况下发现左与右是一个偏好问题(因此是 SO 文章)。我有兴趣查看一个可以解释的链接。
  • 因为只使用左连接可以更清楚地向初级开发人员表达意图并减少他们的困惑,混合或使用右连接并没有真正的好处。此外,左连接将更重要的表格放在文本的最前面,在扫描时加快理解速度。
猜你喜欢
  • 2020-08-11
  • 2017-10-05
  • 2020-03-28
  • 2014-08-04
  • 2016-08-14
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多