过滤器如何影响sql中的左连接
我试图理解为什么下面的查询只返回一行,而不考虑过滤器如何影响sql中的左连接,sql,join,left-join,Sql,Join,Left Join,我试图理解为什么下面的查询只返回一行,而不考虑LEFT JOIN 将t1(日分区、实体id、特征1)作为(值 ('2020-05-15','id_1','x'), ('2020-05-15','id_2','y') ), t2(日分区、实体id、特征2)为(值 ('2020-05-15','id_1',1) ) 挑选 t1.day分区作为day分区1, t2.日分割为日分割2, t1.实体id作为实体id 1, t2.实体id作为实体id 2 从…起 t1 左连接 t2 在…上 t1.entit
LEFT JOIN
将t1(日分区、实体id、特征1)作为(值
('2020-05-15','id_1','x'),
('2020-05-15','id_2','y')
),
t2(日分区、实体id、特征2)为(值
('2020-05-15','id_1',1)
)
挑选
t1.day分区作为day分区1,
t2.日分割为日分割2,
t1.实体id作为实体id 1,
t2.实体id作为实体id 2
从…起
t1
左连接
t2
在…上
t1.entity\u id=t2.entity\u id
哪里
t2.day_分区='2020-05-15'
;
返回
day_partition_1 | day_partition_2 | entity_id_1 | entity_id_2
-----------------+-----------------+-------------+-------------
2020-05-15 | 2020-05-15 | o1 | o1
但是,卸下
WHERE
t2.day_partition = '2020-05-15'
会回来的
day_partition_1 | day_partition_2 | entity_id_1 | entity_id_2
-----------------+-----------------+-------------+-------------
2020-05-15 | 2020-05-15 | id_1 | id_1
2020-05-15 | NULL | id_2 | NULL
我发现这样的行为是不直观的,它背后的规则是什么?如果你把条件放在
连接中,它就会像你期望的那样工作
SELECT
t1.day_partition AS day_partition_1,
t2.day_partition AS day_partition_2,
t1.entity_id AS entity_id_1,
t2.entity_id AS entity_id_2
FROM
t1
LEFT JOIN
t2
ON
t1.entity_id = t2.entity_id AND t2.day_partition = '2020-05-15'
查询解析器不知道您在想什么。如果在where
子句中过滤数据,它会影响所有记录,而不仅仅是联接表的记录。这是设计的。where
子句中的条件是强制性的,因此在left join
ed表中放置一个条件,最终会逐出left join
返回为空的行。基本上,这会将左连接
转换为内部连接
您需要将所有与来自left join
ed表的列相关的谓词放在join的on
子句中:
FROM t1
LEFT JOIN t2
ON t1.entity_id = t2.entity_id
AND t2.day_partition = '2020-05-15'
通过查看您的结果集,我倾向于认为您实际上想要一个关于t1
的条件:
FROM t1
LEFT JOIN t2
ON t1.entity_id = t2.entity_id
WHERE t1.day_partition = '2020-05-15'
“左连接表”是指右边的表,即我的示例中的t2
?请您进一步澄清“查询解析器不知道您在想什么”是什么意思?您问您的查询有什么意义。您只想筛选联接表的记录。但是数据库引擎不知道您的意图。它只是匹配您在where
子句中添加的所有内容