#sql #oracle
#sql #Oracle
Вопрос:
У меня есть такой сценарий (я придумал его, чтобы он был похож на мой случай) есть парковка с 3 этажами, все люди, которых они хотят вывести на парковку, заблокированы 1 машиной, поэтому все люди пошли в магазин / торговый центр и сказали, какая машина блокируется позадиего, так, например, автомобиль 2 блокируется автомобилем 1, автомобиль 12 блокируется автомобилем 2, автомобиль 99 блокируется автомобилем 12 и так далее. итак, для этого простого примера автомобиль 1 блокирует все автомобили.
car_number , blocking_car, floor
1 2 1
2 12 2
7 15 1
9 20 2
12 7 1
15 2 1
20 12 2
99 12 2
SELECT car_number , blocking_car, floor
FROM parking_cars
START WITH id = 0
CONNECT BY blocking_car= car_number
но это не дает машине 1 этаж 1
Комментарии:
1. Откуда
id = 0
берется?2. Ваш набор данных неполный? Нет машины 12.
3. @user9601310 я не знал, с чего начать, я добавил car 12, я забыл его добавить
4. Это приводит к циклу — 12 блоков 7, 7 блоков 15, 15 блоков 2, 2 блока 12!
Ответ №1:
Вы можете найти заблокированный автомобиль, используя not exists
:
select pc.*
from parking_cars pc
where not exists (select 1
from parking_cars pc2
where pc2.blocking_car = pc.car_number
) and
floor = 1;
Это приводит к тому, что автомобиль на этаже 1 не блокируется никаким другим автомобилем.
Вот скрипка db<> .