在网上找到关于sql left join的代码示例,我想确保我正确得到它(因为我不是专家)
SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field AND table1.common_field_2 = table2.common_field_2
WHERE table1.column3 = ... AND table2.common_field IS NULL
我的问题是AND table2.common_field IS NULL
部分以及它如何影响上面的ON。
对我来说,似乎连接结果只包含它们存在于table1上的那些,但不包含在基于common_field的table2上。
这是对的吗?可以写得更简单,因为上面的内容似乎让我感到困惑。
答案 0 :(得分:1)
任何SQL开发的第一步都是检查实际存储在打算在查询中使用的表中的数据。
数据的存储方式将影响查询结果,尤其是在过滤NULL
或检查行是否存在时。
使用EXISTS
或NOT EXISTS
检查一个或多个行的存在/不存在非常有效,在WHERE
子查询中提供EXISTS
子句不会逻辑冲突(例如NOT EXISTS
和<>
一起使用),这可能会造成混淆,并产生难以测试的结果。
table2.common_field
是否包含任何NULL
?如果是这样,明智的做法是先对嵌套查询,CTE或视图中的内容进行过滤,然后在主查询中使用该结果。
如果table2.common_field
不包含NULL
或没有NOT NULL
约束,则可能您正在使用table2.common_field
IS NULL
来过滤{{ 1}},其中LEFT JOIN
的加入条件不匹配。如果是这种情况,并且您想坚持使用table2
,建议您嵌套查询并在外部查询的LEFT JOIN
上进行过滤。
有两个选项:
选项1:使用NULL
,对外部查询中的LEFT JOIN
进行过滤。
请注意为NULL
谨慎使用别名,这很重要。
table2.common_field
选项2(推荐):使用SELECT
result.*
FROM
(
SELECT table1.column1, table2.column2, table2.common_field as table2_common_field...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field AND table1.common_field_2 = table2.common_field_2
WHERE table1.column3 = ...
) result
WHERE result.table2_common_field IS NULL;
。
NOT EXISTS