左连接到同一个表SQL

左连接到同一个表SQL,sql,sql-server,Sql,Sql Server,我试图在同一查询中对同一个表进行左联接,但结果不正确,我用子查询解决了问题这是错误的查询: 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.

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

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
我对这些问题有点困惑,如果你能给我一些与这个话题相关的信息,我将非常感谢你


谢谢

您的第一个查询非常接近。将“ta.state”移到where子句。联接是两个表之间的关系,但只是“lta”别名上的次要条件

因此,您的主要标准是ta.state为“C”,但仅当lta的第二个(左连接)别名中的“a”和“E”实例不匹配时,对于“NOT existance”检查案例,我强烈建议您使用
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
子句。

向下投票歇斯底里?
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')
  )