Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
三个表的正确左联接-SQL_Sql_Sql Server_Left Join - Fatal编程技术网

三个表的正确左联接-SQL

三个表的正确左联接-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

更新-好的,这三个答案都有道理,我将逐一尝试,因为我很好奇是否有性能+/-,但我不确定我的表中是否有足够的测试数据来确定这一点

我试图查看表A并搜索表B或表C中是否存在用户,以便从表A中找到任何不存在于其他两个表中的至少一个表中的人,他们不需要同时存在于这两个表中,仅存在于B或C中

类似这样的东西,但不必使用下面几乎相同的语句

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中的行,则可能会得到更多的结果。