我有盒子和盒子里可以包含的物品。盒子和物品都有状态。框状态例如是打包,解包,发送,接收等 - 整数。项目状态被扫描,未扫描和未知(空) - 布尔值。
或作为表格:
因此,一个方框可以有很多项目,但一个项目只能包含在一个方框中。
首先,我希望能够找到status = 0的所有框,其中根本不包含任何项目,或者只包含状态为false和/或null的项目。最后,我想将所有匹配框的状态更改为1。
样本数据和预期数据:
boxes [pk] int id,int status,character(20)test_text
0;0;"(no items)"
1;0;"(items with false)"
2;0;"(items with null)"
3;0;"(items with null and false)"
4;0;"(items with true)"
5;0;"(items with true and false)"
6;0;"(items with true and null)"
7;0;"(items with true and false and null)"
8;1;"(no items)"
9;1;"(items with false)"
10;1;"(items with null)"
11;1;"(items with true)"
items [pk] int id,int box_id,boolean status
0;1;false
1;2;null
2;3;false
3;3;null
4;4;true
5;5;true
6;5;false
7;6;true
8;6;null
9;7;true
10;7;false
11;7;null
12;9;false
13;10;null
14;11;true
expect - boxes [pk] int id,int status,character(20)test_text
0;0;"(no items)"
1;0;"(items with false)"
2;0;"(items with null)"
3;0;"(items with null and false)"
我无法弄清楚如何编写正确的代码来执行此操作。我正在使用postgresql。
感谢任何帮助!
答案 0 :(得分:2)
这样的事情:
select bb.id
from boxes bb
left join items ii on ii.box_id = bb.id
where bb.status = 0
group by bb.id
having sum(case when ii.status = true then 1 else 0 end) = 0
答案 1 :(得分:1)
状态为0的所有方框
where boxes.status = 0
根本没有任何项目,或者只有状态为false和/或null的项目。
即。不包含任何状态为true的项目的框
where boxes.id not in (select box_id from items where status = true)
完整的查询:
select *
from boxes
where status = 0
and id not in (select box_id from items where status = true);
(如果您愿意,可以用NOT IN
子句替换NOT EXISTS
子句。我更喜欢NOT IN
。)