【问题标题】:LEFT JOIN with condition in WHERE clauseLEFT JOIN 与 WHERE 子句中的条件
【发布时间】:2020-05-20 20:56:52
【问题描述】:
SELECT
    supplies.id,
    supplierId,
    supplies.date,
    supplies.commodity,
    supplier_payments.date AS paymentDate,
FROM
    supplies
INNER JOIN suppliers ON suppliers.id = supplies.supplierId
LEFT JOIN supplier_payments ON supplier_payments.supplyId = supplies.id
WHERE supplier_payments.isDeleted = 0 AND supplierId = 1

我正在尝试从supplies 表中获取所有记录,并从supplier_payments 中获取相关记录,但supplier_payments.isDeleted 应该等于0。现在我只从至少有一个的供应品中获取记录会发生什么供应商付款,因为条件。有没有办法获取所有供应记录和有条件的供应付款?

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 停止尝试编写您的总体目标并从给定的代码中解释您的期望以及原因。
  • 这是一个常见问题解答。在考虑发布之前,请阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 我猜你是在讽刺。这样的粗鲁是绝对不合适的。您的问题很差,重复,我的 cmets 是相关的。
  • 我的 cmets 中没有任何内容是负面的,它们很有帮助且适当,您的批评与网站惯例不一致。我已经完成了。

标签: sql join left-join where-clause


【解决方案1】:

考虑将LEFT JOINed 表上的条件移至JOINON 子句:

SELECT
    sr.id,
    se.supplierId,
    se.date,
    se.commodity,
    sp.date AS paymentDate,
FROM supplies se
INNER JOIN suppliers sr ON sr.id = se.supplierId
LEFT JOIN supplier_payments sp
    ON sp.supplyId = se.id
    AND sp.isDeleted = 0
WHERE se.supplierId = 1

旁注:

  • 在多表查询中,始终使用其所属的表来限定每一列,以使查询更容易理解并避免歧义

  • 表别名使查询更易读写

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 2018-05-10
    • 2014-05-25
    • 1970-01-01
    • 2023-03-29
    • 2011-07-06
    • 2021-02-15
    • 2017-07-31
    相关资源
    最近更新 更多