从左表中重写所有记录并从右侧匹配记录

时间:2015-05-13 10:01:52

标签: mysql

我正在尝试四个查询来检索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'

请帮忙。

2 个答案:

答案 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