【问题标题】:Proper Left join of three tables - SQL三张表的正确左连接 - SQL
【发布时间】:2013-12-09 02:35:02
【问题描述】:

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

我正在尝试查看表 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|
+---------+--------+

感谢您的任何建议!

【问题讨论】:

    标签: sql sql-server left-join


    【解决方案1】:

    您可以在一个查询中连接所有表。

    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
    

    【讨论】:

      【解决方案2】:

      为什么不直接使用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);
      

      【讨论】:

        【解决方案3】:

        你可以像下面这样简单地加入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
        

        【讨论】:

          【解决方案4】:

          您的查询无法运行,因为您有 WHERE tableA.emp_id IS NULL,而 TableA 是您要测试的 emp_id,您应该使用 TableB.eemp_id IS NULLTableC.emp_id IS NULL 测试第二个查询。

          由于您想要至少在 tableB 或 tableC 中不存在的行,您可以对 tableB 和 tableC 执行 LEFT JOIN 并使用 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
          

          【讨论】:

          • 同意,当我将 WHERE 复制到论坛时,我犯了一个错误,它应该是 tableB.emp_id 但是当我使用 OR 而不是 AND 时,就像你在上面显示的那样,我得到了一堆结果,我认为它显示的是 A 中不在 B 中的每个人,然后是 A 中不在 C 中的每个人。当我使用 AND 时,它可以工作。我很困惑,因为我得到一个 emp_id 显示两次,但我意识到我有一个重复,需要 SELECT DISTINCT 并且它有效。谢谢。
          • 使用 OR 你有不在 B 或不在 C 中的行,这可能会给你更多的结果。
          猜你喜欢
          • 1970-01-01
          • 2014-10-26
          • 2016-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-03
          • 2018-11-06
          相关资源
          最近更新 更多