2014-01-18 126 views
0

我有3个表,dbo.employees,dbo.cars,dbo.hours。我基于另一个检索三个表格。 dbo.mployees总是有一行显示。 dbo.cars有时取决于员工,dbo.hours有时取决于汽车。TSQL左连接:无论匹配显示结果

SELECT   e.*, c.*, h.* 
FROM   dbo.emploees e 
LEFT JOIN  dbo.cars c ON e.id=c.employeeID 
LEFT JOIN  dbo.hours h ON c.id=h.carID 
WHERE   c.name='Honda City' 
ORDER BY  e.id ASC; 

我想向所有员工展示。如果在汽车上有匹配,则显示汽车值,否则显示空值。如果存在匹配,则显示它们,否则为空值。

如果在所有三张桌子上都有匹配的情况下,我所做的说明非常有效,当它没有显示任何内容时。根本没有雇员。

+0

适用于我。只有当我得到你的结果时,没有一个没有汽车的员工。 –

+0

在我尝试使它尽可能漂亮和简单,我拿出原来的职位在哪里条件。我将它添加回来。 – user1695981

+0

那么你的尝试使查询变得非常有趣,它完成了一个完全不同的查询,它确实有效! –

回答

3

您的数据必须存在一些其他问题,因为您的查询工作得很好。请点击这里演示

SQL Demo

如果要筛选记录左连接,那么你需要在join clause添加条件如下图所示。如果您在where clause中添加过滤条件,那么它将过滤整个结果,因此它不会返回汽车名称为空的其他雇员。 where clause的条件适用于inner join,但不适用于left join

SELECT   e.*, c.*, h.* 
FROM   dbo.employees e 
LEFT JOIN  dbo.cars c ON e.id=c.employeeID AND c.name='Honda City' 
LEFT JOIN  dbo.hours h ON c.id=h.carID 
ORDER BY  e.id ASC; 
+0

U're right。我拿出了“WHERE”条件(编辑它再次),我想这就是为什么它的工作原理,如果我要添加WHERE c.name ='本田城市',它不会显示所有员工,我怎样才能解决这个问题? – user1695981

+0

检查我更新的答案 –

0
SELECT e.*, ch.* 
FROM dbo.employees e 
LEFT JOIN  
(
Select c.*, h.* 
From dbo.cars c 
LEFT JOIN dbo.hours h ON c.id=h.carID 
WHERE c.name='Honda City' 
) ch 
ON e.id = ch.employeeID 

ORDER BY e.id ASC; 

只要你添加的where子句都没有车命名的本田城市的员工得到了过滤掉。

+0

你确定这是你想要的吗?任何不是本田市汽车的员工也将被退回。 –

0

如果你想显示谁要么没有车本田思迪所有员工,你将需要有标准的WHERE子句中:

SELECT   e.*, c.*, h.* 
FROM   dbo.emploees e 
LEFT JOIN  dbo.cars c ON e.id=c.employeeID 
LEFT JOIN  dbo.hours h ON c.id=h.carID 
WHERE   c.name='Honda City' OR c.ID IS NULL 
ORDER BY  e.id ASC; 

如果你想显示所有雇员(不分车型),以及只有显示该车的细节和时间,当汽车处于一个本田思迪,你应该有JOIN子句中的标准:

SELECT   e.*, c.*, h.* 
FROM   dbo.emploees e 
LEFT JOIN  dbo.cars c ON e.id=c.employeeID AND c.name='Honda City' 
LEFT JOIN  dbo.hours h ON c.id=h.carID 
ORDER BY  e.id ASC;