【问题标题】:MySQL - Why does WHERE ignore RIGHT JOIN?MySQL - 为什么 WHERE 忽略 RIGHT JOIN?
【发布时间】:2021-11-12 13:09:06
【问题描述】:

我有以下 MySQL 查询:

SELECT inv.inventory_id, inv.item_id, item.description, inv.quantity, item.class_id, class.description AS class,
class.is_spool, inv.location_id, location.description AS location, location.division_id, division.name AS division,
inv.service_date, inv.reel_number, inv.original_length, inv.current_length, inv.outside_sequential,
inv.inside_sequential, inv.next_sequential, inv.notes, inv.last_modified, inv.modified_by  
FROM reel_inventory AS inv
INNER JOIN reel_items AS item ON inv.item_id = item.item_id
INNER JOIN reel_locations AS location ON inv.location_id = location.location_id
INNER JOIN locations AS division ON location.division_id = division.location_id
RIGHT JOIN reel_classes AS class on item.class_id = class.class_id;

查询完全按预期工作。我试图做的是用一个限定符向这个查询添加一个 WHERE 子句。例如:

RIGHT JOIN reel_classes AS class ON item.class_id = class.class_id
WHERE inv.current_length  > 0;

当我这样做时,来自 RIGHT JOIN 的所有结果都不包含在结果中。我没有丰富的高级查询经验,但是有人可以解释为什么在使用 WHERE 时将 RIGHT JOIN 从结果集中排除,以及如何属性编写查询以包含 RIGHT JOIN 信息?

提前致谢。

【问题讨论】:

  • LEFT JOIN ON 返回 INNER JOIN ON 行 UNION ALL 由 NULL 扩展的不匹配的左表行。同样对于 RIGHT JOIN ON 和右表行。作为 OUTER JOIN ON 的一部分,始终知道您想要什么 INNER JOIN ON。在 WHERE、INNER JOIN 或 HAVING 之后,需要右/左 [sic] 表列不为 NULL 会删除引入了 NULL 的行,即仅在行上留下 INNER JOIN,即“将 OUTER JOIN 转换为 INNER加入”。你有那个。 (如果您想找到更多答案,这个外连接问题的大多数重复项都是询问重新左连接。)
  • 这是一个常见问题解答。请在考虑发布之前阅读手册和谷歌任何错误消息和许多清晰、简洁和准确的问题/问题/目标的措辞,带有和不带有您的特定名称/字符串/数字、“site:stackoverflow.com”和标签;阅读许多答案。反映你的研究。请参阅How to AskHelp center 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。

标签: mysql where-clause outer-join


【解决方案1】:

你想要的是:

RIGHT JOIN reel_classes AS class
    ON item.class_id = class.class_id AND
       inv.current_length  > 0;

你的问题是为什么RIGHT JOIN 变成带有WHERE 子句的INNER JOIN

原因很简单。对于不匹配的行,inv.current_lengthNULL,这将导致比较失败。

我还建议您使用LEFT JOIN,从要保留所有行的表开始。大多数人发现“将所有行保留在第一个表中”而不是“将所有行保留在某个名称将出现的表中”的逻辑更容易理解。

【讨论】:

  • 这回答了两个问题,“为什么在使用 WHERE 时从结果集中排除 RIGHT JOIN,以及如何属性写入查询以包含 RIGHT JOIN 信息?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多