Я хочу создать сложный запрос, который выполняет следующие действия:
получить laptop
, service
, technician
таблицы lst
в соответствии с ноутбуком равно X (число)
из тех строк, которые вы получаете, удалите laptop
(фактически не можете удалить, поэтому сделайте это null
)
из тех же строк, возможно, у некоторых не было technician
. Таким образом, это строки, которые теперь содержат только service
, без laptop
и без technician
Хитрая часть: оставьте все service
этих строк.
Если они не найдены где-либо еще в таблице lst
, будучи в паре с другими laptop
или technician
, перейдите в таблицу service
и удалите эту строку. Затем вернитесь к lst
и удалите все строки, которые имеют service
, а не laptop
или technician
.
Если они найдены где-либо еще в таблице lst
в паре с другими laptop
или technician
, то просто удалите все строки lst
в lst
, у которых есть service
и нет laptop
или technician
Пример
lst table
laptop service technician
17 10 25
17 10 26
17 4 null
17 2 null
125 2 null
и мы выполним вышеприведенное, имея laptop = 17
становится
laptop service technician
null 10 25
null 10 26
null 4 null
null 2 null
125 2 null
Строка № 3 должна быть удалена, потому что она не имеет technician
и laptop
. Кроме того, service
4 таблицы service
необходимо удалить, поскольку в таблице lts
больше нигде ничего не найти в паре с чем-либо.
Строка № 4 должна быть удалена, потому что она не имеет technician
и laptop
. Но service
2 таблицы service
не будет удален, поскольку он находится в другом месте в lts
, в паре с другим laptop
(последняя строка)
Итак, lts
теперь становится
laptop service technician
null 10 25
null 10 26
125 2 null
и я только удаляю service
4 из таблицы service
Я пробовал несколько комбинаций запросов / подзапросов, например
select id , technician from lts where laptop= 17 and technician in(
select id from
lts
where id in
(select id from lts where technician is null and laptop = 17)
);
Но ничего не работает, и ничто не может сохранить все идентификаторы, чтобы пойти и удалить из таблицы service
, позже.
Полагаю, мне придется использовать функцию или транзакцию pl/pgsql
, но даже с транзакцией я не знаю, как кратко сохранить идентификаторы для последующего удаления из таблицы service
.
Есть идеи, как это сделать? Стратегия или базовый код?
Я использую Postgresql 10
Спасибо