我有一个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的work_order输出,因为这是唯一缺少“ V40”状态的work_order。
答案 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。