这是我的查询。我正在尝试使用已定义的表加入表。但问题是,当我们尝试左连接时,它会像内连接一样受到影响。
SELECT A.*,B.*,
(CASE WHEN A.preday != '' THEN 'A' ELSE 'P' END) AS PreStat
FROM (
SELECT '2016-05-04' AS preday
UNION
SELECT '2016-05-03'
UNION
SELECT '2016-05-02'
) AS A
LEFT JOIN `student_attendence` AS B ON B.date = A.preday
WHERE student_id='1' ;
例如,在我的右表中,不包含值为' 2016-05-02'的日期字段。 ,但是当我们尝试左连接时,它应该带有NULL值..但它不会来。
请帮我解决。
答案 0 :(得分:1)
想一想这一秒。 Student_ID仅存在于student_Attendence表中(对于这两个表而言)。学生可能没有特定日期的记录(如果您未在结果中获得02,则必须如此;至少对于学生1而言)如果您希望从派生联盟表中获得所有日期;然后你需要在加入之前过滤students_ID,这样学生1记录的不匹配日就会从左连接中保留
SELECT A.*,B.*, (CASE WHEN A.preday != '' THEN 'A' ELSE 'P' END) AS PreStat
FROM (SELECT '2016-05-04' AS preday
UNION SELECT '2016-05-03'
UNION SELECT '2016-05-02') AS A
LEFT JOIN `student_attendence` AS B
ON B.date = A.preday
and student_id='1' ;
Student_ID 1的Student_Attendance将是......
ID Date
1 2016-05-05
1 2016-05-04
1 2016-05-03
1 2016-05-01
所以左连接会导致......
Preday ID Date
2016-05-04 1 2016-05-04
2016-05-03 1 2016-05-03
2016-05-02
当你申请where子句时...自2016-05-02以来没有学生1的参赛作品,它就会被淘汰..
Preday ID Date
2016-05-04 1 2016-05-04
2016-05-03 1 2016-05-03
但是如果你将where子句移动到连接...你可以在连接之前应用过滤器,从而保留02日期。
Preday ID Date
2016-05-04 1 2016-05-04
2016-05-03 1 2016-05-03
2016-05-02
答案 1 :(得分:0)
原因是因为查询的逻辑查询处理作为要执行的第一个子句是from子句然后在>分组>有>选择>
订购因此,当您执行自己的查询时,要执行的第一个子句是从中返回的' 2016-05-02'与左连接一样为null 但是后面的where子句过滤结果集并删除它,因为null是未知的(它不是一个值,它代表缺失值)
所以你可以用where和operator替换where子句。