【问题标题】:LEFT OUTER JOIN with WHERE clause on 2nd table, not effecting 1st tableLEFT OUTER JOIN 与第二张表上的 WHERE 子句,不影响第一张表
【发布时间】:2019-06-21 11:00:44
【问题描述】:

我正在尝试从两个表中返回一组记录。 我正在使用LEFT OUTER JOIN,因为我想要表 1 中的所有数据。 如果满足某个子句,我只想要表 2 JOINED 中的数据。

如果表 2 中的记录不符合 WHERE 子句,则该子句似乎覆盖了 LEFT OUTER JOIN 并且不返回表 1 中的记录。

SELECT p.code, p.name, d.product_code, d.detail_type, d.description
  FROM products p
  LEFT OUTER JOIN product_details d
    ON p.code = d.product_code 
 WHERE product_details.detail_type = 'ALTERNATIVE NAMES'

我希望返回产品中的所有行,但我只希望在 product_details.detail_type = 'ALTERNATIVE NAMES' 时加入来自 product_details 的行

我正在寻找一些关于这是否可能的指导,或者我是否应该在初始 JOIN 之后删除不需要的数据?

【问题讨论】:

  • 这是一个常见问题解答。在考虑发布之前,请始终在谷歌上搜索任何错误消息以及您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括和不包括您的特定字符串/名称;阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 了解 LEFT JOIN ON 返回的内容:INNER JOIN ON 行 UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。 WHERE 或 INNER JOIN ON 在 OUTER JOIN ON 删除任何由 NULL 扩展的行后,需要右 [sic] 表列不为 NULL,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。

标签: mysql sql left-join where-clause


【解决方案1】:

ON Clause 中使用product_details.detail_type = 'ALTERNATIVE NAMES' 条件而不是where Clause

SELECT products.code, products.name, product_details.product_code, product_details.detail_type, product_details.description
FROM products 
LEFT OUTER JOIN product_details 
ON products.code = product_details.product_code 
and product_details.detail_type = 'ALTERNATIVE NAMES'

【讨论】:

    【解决方案2】:

    只需将WHERE 替换为AND 即可完全使用LEFT [OUTER] JOIN

    例如

    ON products.code = product_details.product_code
            AND product_details.detail_type = 'ALTERNATIVE NAMES'
    

    否则查询将被视为INNER JOIN

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2011-01-30
      • 2023-03-29
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多