答案 0 :(得分:2)
您可以使用NOT IN语句排除具有' INPROGRESS'的行。例如:
SELECT *
FROM tbl
WHERE LOCKID NOT IN ( SELECT LOCKID
FROM tbl
WHERE STATE = 'INPROGRESS' )
您也可以使用NOT EXISTS来做同样的事情
SELECT *
FROM tbl t1
WHERE NOT EXISTS ( SELECT *
FROM tbl t2
WHERE t2.STATE = 'INPROGRESS'
AND t1.LOCKID = t2.LOCKID )
有时一个或另一个构造的表现会更好,但在大多数情况下,根据我的经验,它们几乎相同。
答案 1 :(得分:0)
返回表中的所有记录(别名" A"),其中state is not inprogress,前提是在一组状态为inprogress的数据中找不到lockID。
这使用了将内部查询绑定到外部的相关查询的概念。子查询中的select 1被丢弃(但由于编译器需要select来返回一个值,即使我们不使用它),因为我们只关心LOCKID的匹配。
SELECT *
FROM TABLE A
WHERE A.STATE <> 'INPROGRESS'
AND NOT EXISTS (SELECT 1
FROM TABLE B
WHERE B.STATE = 'INPROGRESS'
AND A.LOCKID = B.LOCKID)