左联接到同一表的SQL

cam*_*.cc 4 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
Run Code Online (Sandbox Code Playgroud)

这就是我解决的方式

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢

DRa*_*app 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
Run Code Online (Sandbox Code Playgroud)

因此,您的主要标准是ta.state是“ C”,但前提是lta的第二个(左联接)别名中的“ A”和“ E”实例不匹配