如何选择A列中的值相同而B列中不存在某些值的数据?

时间:2019-06-06 10:32:54

标签: postgresql

我有一个PostgreSQL数据库。在A列中,我有工作单的名称。在B列中,我具有工作单的当前/过去状态。我只想从A列中选择那些工作订单的某些状态不存在的工作订单。

这是我正在尝试的查询:

SELECT work_order FROM table WHERE status IN ('B10') AND NOT EXISTS (SELECT work_order FROM _2221_002 WHERE status IN ('V40'))

work_order | status
123456     | B10
123456     | B40
123456     | V40
234567     | B10
234567     | B40
345678     | B10
345678     | B40
345678     | V40

我的选择空了。但是,我希望看到234567的wo​​rk_order输出,因为这是唯一缺少“ V40”状态的work_order。

2 个答案:

答案 0 :(得分:0)

一个简单的选项使用聚合:

SELECT work_order
FROM yourTable
GROUP BY work_order
HAVING COUNT(CASE WHEN status = 'V40' THEN 1 END) = 0;

如果您使用的是Postgres 9.4或更高版本,我们可以使用HAVING来缩短FILTER子句:

SELECT work_order
FROM yourTable
GROUP BY work_order
HAVING COUNT(*) FILTER(WHERE status = 'V40') = 0;

答案 1 :(得分:0)

尝试类似

SELECT work_order FROM table WHERE status='B10'
MINUS 
SELECT work_order FROM table WHERE status = 'V40'

为此类情况明确定义了负运算符,在这种情况下,您希望元素是表中一组数据的一部分,而不是另一组数据的一部分。 https://www.techonthenet.com/sql/minus.php http://www.sqltutorial.org/sql-minus/

如OP所述,Postgre将此操作符称为EXCEPT。