Получить строки с заданным набором значений и без других

Работа с Db2 в z/OS.

Рассмотрим простой пример таблицы ORDER и дочерней таблицы ORDER_ITEM. PK для дочернего элемента: ORD_NUM плюс PART_NUM. Я хочу найти строки в таблице ORDER_ITEM с частями, которые имеют только определенный набор значений PART_NUM и никакие другие. Так, например, если интересующие меня части

PART1, PART2 

а в таблице ORDER_ITEM есть такие строки

ORD1 PART1
ORD1 PART2
ORD2 PART1
ORD3 PART2
ORD4 PART1
ORD4 PART2
ORD4 PART3

Такой запрос, как

SELECT blah FROM ORDER_ITEM WHERE PART_NUM IN ('PART1', 'PART2') 

будет правильно возвращать ORD1, ORD2, ORD3, но также неправильно будет возвращать ORD4.

Я работаю с Db2 на z/OS.

Спасибо


person ChuckLeviton    schedule 19.06.2020    source источник


Ответы (1)


Я думаю, вы хотите:

select oi.*
from order_item oi
where not exists (select 1
                  from order_item oi2
                  where oi2.order_num = oi.order_num and
                        oi2.part_num not in ('PART1', 'PART2')
                 );

То есть получить все строки в таблице, где в заказе нет детали, не входящей в указанный список деталей.

person Gordon Linoff    schedule 19.06.2020
comment
Спасибо большое. Вы знаете, инстинктивно я бы написал select oi.* from order_item oi where oi.part_num in ('PART1', 'PART2') and not exists (select 1 from order_item oi2 where oi2.order_num = oi.order_num and oi2.part_num not in ('PART1', 'PART2') ); Но, очевидно, мне не нужен этот первый предикат, и я просто с трудом обдумываю его, даже когда он дает нужный мне результат! - person ChuckLeviton; 13.07.2020