过滤器如何影响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
子句中添加的所有内容