sql左连接解释

时间:2017-06-19 14:26:20

标签: sql

在网上找到关于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上。

这是对的吗?可以写得更简单,因为上面的内容似乎让我感到困惑。

1 个答案:

答案 0 :(得分:1)

任何SQL开发的第一步都是检查实际存储在打算在查询中使用的表中的数据。 数据的存储方式将影响查询结果,尤其是在过滤NULL或检查行是否存在时。 使用EXISTSNOT 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