三个表的正确左联接-SQL
更新-好的,这三个答案都有道理,我将逐一尝试,因为我很好奇是否有性能+/-,但我不确定我的表中是否有足够的测试数据来确定这一点 我试图查看表A并搜索表B或表C中是否存在用户,以便从表A中找到任何不存在于其他两个表中的至少一个表中的人,他们不需要同时存在于这两个表中,仅存在于B或C中 类似这样的东西,但不必使用下面几乎相同的语句三个表的正确左联接-SQL,sql,sql-server,left-join,Sql,Sql Server,Left Join,更新-好的,这三个答案都有道理,我将逐一尝试,因为我很好奇是否有性能+/-,但我不确定我的表中是否有足够的测试数据来确定这一点 我试图查看表A并搜索表B或表C中是否存在用户,以便从表A中找到任何不存在于其他两个表中的至少一个表中的人,他们不需要同时存在于这两个表中,仅存在于B或C中 类似这样的东西,但不必使用下面几乎相同的语句 SELECT emp_id FROM tableA LEFT JOIN TableB ON tableA.emp_id = tableB.emp
SELECT emp_id
FROM
tableA
LEFT JOIN
TableB
ON
tableA.emp_id = tableB.emp_id
WHERE
TableA.emp_id IS NULL
SELECT emp_id
FROM
tableA
LEFT JOIN
TableC
ON
tableA.emp_id = tableC.emp_id
WHERE
TableA.emp_id IS NULL
Table A
+---------+--------+-----------+
| Emp_ID | Status | hire_date |
+---------+--------+-----------+
| 12345 | happy | 10/10/2005|
| 54321 | sad | 12/01/2009|
+---------+--------+-----------+
Table B
+---------+--------+
| Emp_ID | Weight |
+---------+--------+
| 12345 | 185 |
| 54321 | 150 |
+---------+--------+
Table C
+---------+--------+
| Emp_ID | City |
+---------+--------+
| 12345 | Chicago|
| 54321 | Atlanta|
+---------+--------+
谢谢你的建议 为什么不使用not in来表示查询
为什么不直接使用not in表示查询
您可以在一个查询中联接所有表
SELECT a.Emp_ID -- a.* <<== if you want to include all columns
FROM tbA a
LEFT JOIN tbB b
ON a.Emp_ID = b.Emp_ID
LEFT JOIN tbC c
ON a.Emp_ID = c.Emp_ID
WHERE b.Emp_ID IS NULL
AND c.Emp_ID IS NULL -- <<== AND should be use here
您可以在一个查询中联接所有表
SELECT a.Emp_ID -- a.* <<== if you want to include all columns
FROM tbA a
LEFT JOIN tbB b
ON a.Emp_ID = b.Emp_ID
LEFT JOIN tbC c
ON a.Emp_ID = c.Emp_ID
WHERE b.Emp_ID IS NULL
AND c.Emp_ID IS NULL -- <<== AND should be use here
您可以像下面这样简单地连接3个表
Select emp_id from table1 a left join table2 b on a.emp_id=b.emp_id
left join table3 c on c.emp_id=a.emp_id
您可以像下面这样简单地连接3个表
Select emp_id from table1 a left join table2 b on a.emp_id=b.emp_id
left join table3 c on c.emp_id=a.emp_id
您的查询无法工作,因为您有一个WHERE table a.emp_id为NULL,而table a是您要测试的emp_id,您应该使用table b.eemp_id为NULL和table c.emp_id对第二个查询进行测试 由于您希望至少tableB或tableC中不存在的行,因此可以对tableB和tableC进行左连接,并测试这些表中是否至少有一个emp_id为NULL,带有或
您的查询无法工作,因为您有一个WHERE table a.emp_id为NULL,而table a是您要测试的emp_id,您应该使用table b.eemp_id为NULL和table c.emp_id对第二个查询进行测试 由于您希望至少tableB或tableC中不存在的行,因此可以对tableB和tableC进行左连接,并测试这些表中是否至少有一个emp_id为NULL,带有或
同意,当我把我的WHERE复制到论坛时,我犯了一个错误,它应该是tableB.emp_id,但是当我使用OR而不是,就像你上面展示的那样,我得到了一系列结果,我认为它显示了a中的每个人不在B中,然后是a中的每个人不在C中。当我使用时,它工作正常。我很困惑,因为我得到了一个emp_id显示了两次,但我意识到我有一个副本,需要选择DISTINCT,它工作了。谢谢。有或你有不在B或不在C和右边的行,这可能会给你更多的结果。同意,我在将我的WHERE复制到论坛时犯了一个错误,它应该是tableB.emp_id,但当我使用或而不是,就像你上面显示的那样,我会得到一大堆结果,我认为这是在展示A中不在B中的每个人,然后是A中不在C中的每个人。当我使用它时,它起作用了。我很困惑,因为我得到了一个emp_id显示了两次,但我意识到我有一个副本,需要选择DISTINCT,它工作了。谢谢。如果有或有不在B或C和right中的行,则可能会得到更多的结果。