我想创建一个执行以下操作的复杂查询
根据笔记本电脑等于X(数字)得到表laptop
的service
,technician
,lst
你得到的那些行,删除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
表中的service
4必须删除,因为在lts
表中没有其他任何地方可以找到,与任何东西配对。
必须删除第4行,因为它没有technician
而没有laptop
。但service
表中的service
2将不会被删除,因为它在lts
的其他地方找到,与另一个laptop
配对(最后一行)
所以,lts
现在变成了
laptop service technician
null 10 25
null 10 26
125 2 null
我只删除了service
表中的service
4
我尝试了几个查询/子查询组合,比如
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)
);
但没有任何作用,没有任何东西可以保留所有的ID,以后再从service
表中删除。
我想我将不得不使用pl/pgsql
函数或事务,但即使在事务中我也不知道如何短暂保存任何id以便以后从service
表中删除。
任何想法如何做到这一点?策略或基本代码?
我使用postgresql 10
谢谢
您可以像这样使用CTE来存储中间结果,并在一个查询中执行多个更新操作。
查询看起来像这样(演示想法 - 未经测试):
WITH potentially_orphan_services AS (
SELECT service
FROM lts
WHERE laptop = X AND technician IS NULL
), deleted_services AS (
DELETE FROM services
WHERE service IN (
SELECT service
FROM potentially_orphan_services p
WHERE NOT EXIST (
SELECT 1
FROM lts l
WHERE laptop != X AND l.service = p.service
)
), deleted_lts_without_technician AS (
DELETE FROM lts
WHERE laptop = X AND technician IS NULL
)
UPDATE lts
SET laptop = NULL
WHERE laptop = X AND technician IS NOT NULL