检查结果中的双精度数,然后删除另一个表中的行(如果没有)

问题描述 投票:0回答:1

我想创建一个执行以下操作的复杂查询

根据笔记本电脑等于X(数字)得到表laptopservicetechnicianlst

你得到的那些行,删除laptop(实际上不能删除,所以让它null

相同的行,也许有些没有technician。所以他们是行现在只包含一个service,没有laptop,没有technician

棘手的部分:保留这些行的所有service。 如果在lst表中找不到它们,与其他laptoptechnician配对,则转到service表并删除该行。然后回到lst并删除所有具有service且没有laptoptechnician的行。 如果他们在lst表中的任何其他位置找到,与其他laptoptechnician配对,那么只需删除lst中所有lst行,这些行有service而没有laptoptechnician

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

谢谢

sql postgresql duplicates postgresql-10
1个回答
1
投票

您可以像这样使用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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.