如何根据列的条件从表中选择数据

时间:2017-05-02 15:35:34

标签: sql

我对sql完全不熟悉,我有一个像这样的表:

enter image description here

使用SQL,我想选择那些没有" INPROGRESS"状态为相同的LOCKID。例如,在上面的表中查询应该返回id为4,5,6的行。谢谢。

2 个答案:

答案 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)