正确的左表连接三个表 - SQL

时间:2013-12-08 17:56:49

标签: 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_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|
+---------+--------+

感谢您的任何建议!

4 个答案:

答案 0 :(得分:2)

您可以在一个查询中加入所有表格。

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

答案 1 :(得分:1)

为什么不使用not in表达查询?

SELECT emp_id
FROM tableA
WHERE emp_id not in (select emp_id from TableB) and
      emp_id not in (select emp_id from TableC);

答案 2 :(得分:1)

你可以加入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 :(得分:1)

您的查询无法正常工作,因为您有一个WHERE tableA.emp_id IS NULL,并且TableA是您要测试的emp_id,您应该使用TableB.eemp_id IS NULLTableC.emp_id IS NULL进行第二次测试查询。

由于您需要至少在tableB或tableC中不存在的行,因此可以对tableB和tableC执行LEFT JOIN并测试这些表中的至少一个emp_id是否为空且带有 OR < /强>

SELECT emp_id
FROM tableA
LEFT JOIN TableB ON tableA.emp_id = tableB.emp_id
LEFT JOIN TableC ON tableA.emp_id = tableC.emp_id
WHERE 
    TableB.emp_id IS NULL
 OR TableC.emp_id IS NULL