2015-05-13 97 views
2

我尝试了四个查询来从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

“其中date_format(Datein,'%Y-%m-%d')='2015-05-05'”将结果限制为两条记录。您需要移动where子句并将其添加为左连接条件。 – cjava

回答

-2

这将工作正常。
SQL查询

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 
+1

downvote原因:尝试将具有不同datein值的记录添加到第二个表中。走着瞧吧。 (同样,你有一个错字:'leftjoin'而不是'left join',虽然这不是那种downvote的东西) –

+0

也是,这个问题是关于mysql,而不是sql-server –

+0

好的。它正在使用MSSql –

1

你想要一个左连接。

select t1.*, t2.datein 
    from table1 t1 
    left join table2 t2 
     on t1.empid = t2.empid 

在你的查询,你是指dateinwhere条款的方式,将自动消除任何行,其中datein为空,破坏了left join的outerness。

如果你想过滤的日期,但对于那些不匹配返回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 

这种方法的警告,它可能每个返回多行,如果datein可以在第二个表中有空值。

我个人的偏好是将日期过滤器作为连接谓词的一部分,而不是where

+0

哇,这就像你已经阅读我的评论灰:-)如果datein是一个可空列,你的第三个sql语句可能会返回太多的行。我会建议在你的答案中加上这一点。 –

+0

值得注意的是完整性,但如果该字段可以为空则设计被破坏 –

+0

除非这是一个简化版本,并且表中有更多的列。如果这是完整的设计,那么我同意它没有任何意义使它可以为空。 –

相关问题