SQL查找元素A不包含元素B并包含具有特定状态

时间:2017-01-12 09:22:09

标签: sql postgresql join

我有盒子和盒子里可以包含的物品。盒子和物品都有状态。框状态例如是打包,解包,发送,接收等 - 整数。项目状态被扫描,未扫描和未知(空) - 布尔值。

或作为表格:

  • 方框:[pk] int id,int status
  • 项目:[pk] int id,int box_id,布尔状态

因此,一个方框可以有很多项目,但一个项目只能包含在一个方框中。

首先,我希望能够找到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。

感谢任何帮助!

2 个答案:

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