左连接到同一个表SQL

时间:2016-03-07 16:51:05

标签: sql sql-server

我试图在同一个查询中对同一个表进行左连接,但结果不是okey,我用子查询解决了这个问题,这是错误的查询:

SELECT * FROM TableA ta
  LEFT JOIN TableA Lta ON ta.key = Lta.key
  AND ta.state IN('C')
  AND Lta.state IN ('A','E')
WHERE Lta.key is null

这是我解决的方式

SELECT * FROM (
  SELECT * FROM TableA ta
  WHERE ta.state IN('C')
) AS T LEFT JOIN TableA Lta ON T.key =  Lta.key
AND Lta.state in ('A','E')
WHERE Lta.key IS NULL

如果您能给我一些与此主题相关的信息,我会对这些疑问感到困惑我将非常感谢你

谢谢

2 个答案:

答案 0 :(得分:5)

您在第一次查询时非常接近。将“ta.state”移动到where子句。连接是两个表的关系,但是次要标准就是“lta”别名。

SELECT 
      * 
   FROM 
      TableA ta
         LEFT JOIN TableA Lta 
            ON ta.key = Lta.key
           AND Lta.state IN ('A','E')
   WHERE 
          ta.state IN('C')
      AND Lta.key is null

所以你的主要标准是ta.state是“C”的地方,但是只有当lta的第二个(左连接)别名中的“A”和“E”实例不匹配时

答案 1 :(得分:0)

对于“不存在”检查案例,我强烈建议您使用not exists子查询:

SELECT * FROM TableA ta
WHERE not exists
  (
    SELECT 1 FROM TableA Lta 
    WHERE ta.key = Lta.key
      AND ta.state IN('C')
      AND Lta.state IN ('A','E')
  )

这是性能最友好的方法。

不确定,但您可能应该将ta.state = 'C'移到外部where子句。