我试图在同一个查询中对同一个表进行左连接,但结果不是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
如果您能给我一些与此主题相关的信息,我会对这些疑问感到困惑我将非常感谢你
谢谢
答案 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
子句。