【发布时间】:2020-01-19 14:32:17
【问题描述】:
我有以下查询:
SELECT *
FROM work
LEFT JOIN users ON work.user_id = users.user_id
LEFT JOIN customer ON work.customer_id = customer.customer_id
WHERE customer.visible = 0
问题在于“LEFT JOIN customer ON...”和 WHERE 条件“customer.visible = 0”。 我的表“work”中有条目,其中“customer_id = NULL”,它们被从选择中删除,因为客户表中显然没有 ID 为“NULL”的客户。
我想在我的工作表中保留“customer_id = NULL”的所有条目。
【问题讨论】:
-
将此条件:
customer.visible = 0移至 ON 子句并删除 WHERE。 -
解释:当没有匹配的
customer行时,将加入一个空的customer行。该行中的所有customer列均为空。它的visible列为空,因此,不是 0。 -
问题是当您加入并且客户 ID 为空时,该行中所有与客户相关的列都变为 NULL。这使得 customer.visibility = NULL 并且您的语句不起作用。
-
永远不要使用
SELECT *。始终命名并正确限定您实际希望返回的列 -
了解 LEFT JOIN ON 返回的内容:INNER JOIN ON 行 UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 OUTER JOIN ON 之后,需要右 [sic] 表列不为 NULL 的 WHERE 或 INNER JOIN 删除任何由 NULL 扩展的行,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。