TSQL左连接:显示结果而不考虑匹配

TSQL左连接:显示结果而不考虑匹配,sql,sql-server,tsql,left-join,Sql,Sql Server,Tsql,Left Join,我有3张桌子,dbo.employees,dbo.cars,dbo.hours。我检索这三个表是基于彼此的。dbo.employees始终有一行要显示。dbo.cars有时取决于员工,dbo.hours有时取决于汽车 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

我有3张桌子,dbo.employees,dbo.cars,dbo.hours。我检索这三个表是基于彼此的。dbo.employees始终有一行要显示。dbo.cars有时取决于员工,dbo.hours有时取决于汽车

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;
我想让所有员工都知道。如果车辆上存在匹配项,则显示车辆值,否则为空值。如果HUOR上有匹配项,则显示它们,否则为空值


如果三个表上都有匹配项,那么我的语句非常有效,如果没有匹配项,则不会显示任何内容。根本没有员工。

您的数据肯定存在其他一些问题,因为您的查询工作得非常好。请在这里查看演示

如果要筛选左联接的记录,则需要在
join子句上添加条件,如下所示。如果在
where子句中添加过滤条件,则它将过滤整个结果,因此不会返回车名为null的其他员工。
where子句
中的条件对于
内部联接
是可以的,但对于
左联接
则不是

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;

您的数据肯定还有其他一些问题,因为您的查询工作得非常好。请在这里查看演示

如果要筛选左联接的记录,则需要在
join子句上添加条件,如下所示。如果在
where子句中添加过滤条件,则它将过滤整个结果,因此不会返回车名为null的其他员工。
where子句
中的条件对于
内部联接
是可以的,但对于
左联接
则不是

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;

您的数据肯定还有其他一些问题,因为您的查询工作得非常好。请在这里查看演示

如果要筛选左联接的记录,则需要在
join子句上添加条件,如下所示。如果在
where子句中添加过滤条件,则它将过滤整个结果,因此不会返回车名为null的其他员工。
where子句
中的条件对于
内部联接
是可以的,但对于
左联接
则不是

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;

您的数据肯定还有其他一些问题,因为您的查询工作得非常好。请在这里查看演示

如果要筛选左联接的记录,则需要在
join子句上添加条件,如下所示。如果在
where子句中添加过滤条件,则它将过滤整个结果,因此不会返回车名为null的其他员工。
where子句
中的条件对于
内部联接
是可以的,但对于
左联接
则不是

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;
一旦你加入where条款,所有没有本田汽车的员工都被过滤掉了

一旦你加入where条款,所有没有本田汽车的员工都被过滤掉了

一旦你加入where条款,所有没有本田汽车的员工都被过滤掉了


添加where子句后,所有没有名为本田城市的汽车的员工都会被过滤掉。

如果您想显示所有没有汽车或本田城市的员工,您需要在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;

如果您想显示所有员工(无论车辆类型),并且当车辆为本田城市时,仅显示车辆详细信息和小时数,您应该在加入条款中有以下条件:

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;

如果您想显示所有无车本田城的员工,您需要在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;

如果您想显示所有员工(无论车辆类型),并且当车辆为本田城市时,仅显示车辆详细信息和小时数,您应该在加入条款中有以下条件:

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;

如果您想显示所有无车本田城的员工,您需要在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;

如果您想显示所有员工(无论车辆类型),并且当车辆为本田城市时,仅显示车辆详细信息和小时数,您应该在加入条款中有以下条件:

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;

如果您想显示所有无车本田城的员工,您需要在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;

如果您想显示所有员工(无论车辆类型),并且当车辆为本田城市时,仅显示车辆详细信息和小时数,您应该在加入条款中有以下条件:

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;


对我来说也是如此。我得到你的结果的唯一方法是当没有员工没有车的时候。为了使它尽可能的漂亮和简单,我在最初的帖子中去掉了where条件。我又把它加进去了。好吧,你试图让这个查询变得漂亮,结果变成了一个完全不同的查询,它确实起作用了!不幸的是,这不是我需要的:(由于
其中c.name='Honda City'
谓词SQL Server将
左连接dbo.cars c…
转换为
内部连接dbo.cars c
。因此,SQL Server将执行:
从dbo.employes e内部连接dbo.cars c…左连接..
。对我来说也很有效。我得到结果的唯一方法是当存在n时o没有汽车的员工。为了使查询尽可能的美观和简单,我在原始帖子中删除了where条件。我将其重新添加到了中。好吧,您尝试使查询美观,使其进入了一个完全不同的查询,该查询确实有效!不幸的是,它不是我需要的查询:(由于
其中c.name='Honda City'
谓词SQL Server将
左连接dbo.cars c…
转换为
内部连接dbo.cars c
。因此,SQL Server将执行:
从dbo.employes e internal J选择…)