我正在尝试四个查询来检索Table1中的所有记录并匹配Table2中的记录,但我的查询只返回两个记录而不是三个记录。
Table1:
EmpId name
1 xyz1
2 xyz2
3 xyz3
Table2:
EmpId dateIn
1 2015-05-05
2 2015-05-05
Required result:
EmpId name DateIn
1 xyz1 2015-05-05
2 xyz2 2015-05-05
3 xyz3 NULL
select Table1.EmpId, Table1.name, Table2.dateIn from Table1 left join Table2 on Table1.empid=Table2.empid where date_format(Datein, '%Y-%m-%d')='2015-05-05'
select Table1.EmpId, Table1.name, Table2.dateIn from Table1 left join Table2 on Table1.empid=Table2.empid where date_format(Datein, '%Y-%m-%d')='2015-05-05' group by Table1.EmpId, Table1.name, Table2.dateIn
select Table1.EmpId, Table1.name, Table2.dateIn from Table1,Table2 where Table1.empid=Table2.empid and date_format(Datein, '%Y-%m-%d')='2015-05-05' group by Table1.EmpId, Table1.name, Table2.dateIn
select Table1.EmpId, Table1.name, Table2.dateIn from Table1,Table2 where Table1.empid=Table2.empid and date_format(Datein, '%Y-%m-%d')='2015-05-05'
请帮忙。
答案 0 :(得分:1)
你想要一个左连接。
select t1.*, t2.datein
from table1 t1
left join table2 t2
on t1.empid = t2.empid
在您的查询中,您在datein
子句中引用where
的方式将自动消除datein
为空的任何行,从而破坏left join
的外在性}。
如果您要对日期进行过滤,但对于那些不匹配的内容,请返回null
,则必须将其移至on
子句,如下所示:
select t1.*, t2.datein
from table1 t1
left join table2 t2
on t1.empid = t2.empid and date(t2.datein) = '2015-05-05'
或者,或者,如果您想将其放在where
子句中,出于语义原因,您还需要检查is null
,如下所示:
select t1.*, t2.datein
from table1 t1
left join table2 t2
on t1.empid = t2.empid
where date(t2.datein) = '2015-05-05' or t2.datein is null
如果empid
在第二个表中可以包含空值,则此方法需要注意每datein
可以返回多行。
我个人的偏好是将日期过滤器作为连接谓词的一部分,而不是where
。
答案 1 :(得分:-2)
这样可以正常工作 Sql Query
declare @Table1 as table( empid tinyint, name varchar(10))
insert into @table1 values (1,'xyz1')
insert into @table1 values (2,'xyz2')
insert into @table1 values (3,'xyz3')
declare @Table2 as table (Empid tinyint, datein date)
insert into @Table2 values(1,'2015-05-05')
insert into @Table2 values(2,'2015-05-05')
select Table1.EmpId, Table1.name, Table2.dateIn from @Table1 Table1 left join @Table2 Table2 on Table1.empid=Table2.empid and '2015-05-05'='2015-05-05'--(or date_format(Datein, '%Y-%m-%d')='2015-05-05')
<强>结果强>
EmpId name dateIn
----- ---------- ----------
1 xyz1 2015-05-05
2 xyz2 2015-05-05
3 xyz3 NULL