我有两个表,一个表通过外键链接到另一个表。
我需要创建一个更新语句,它将根据表2中的条件更新表一。但是,条件必须与表2中的一行或多行有关。
示例 - 表二 订单A. 第1行=打开(状态栏) 第2行=关闭(staus列)
当第1行也关闭时(相同的订单号 - 在这种情况下为A),满足条件,然后在另一个表中关闭(更新为关闭)订单。表上只有标题信息(没有多行)。
在更新第一个表之前,我遇到了纠正第二表中多行(必须关闭所有行)的条件的问题。
任何有用的建议都将不胜感激。
答案 0 :(得分:0)
假设(1)键名是ordernum,(2)每个table1条目在table2中至少有一个条目,这是一个应该适合您的简单查询。基本上,not exists子句测试第二个表中没有空行。
update table1
set table1.status = 'closed'
where table1.status = 'open'
and not exists
(select 1
from table2
where table2.ordernum = table1.ordernum
and table2.status = 'open')
这可能需要根据您的业务需求进一步调整。
根据用户请求进行更新:您可以试试这个,但性能可能会受到影响,我还没有测试过:
update table1
set table1.status = 'closed',
table1.count_lines =
(select count(1)
from table2 y
where y.ordernum = table1.ordernum
)
where table1.status = 'open'
and not exists
(select 1
from table2 z
where z.ordernum = table1.ordernum
and z.status = 'open')
更新2 :从上次评论中试试这个。您想要使用所有订单项价格的总和更新ZORDER表。所以你必须更新ZORDER,而不是ZORDERLINE。通过在与订单ID匹配的所有ZORDERLINE行上对EXTENDED_PRICE求和来找到总数。在第一个子查询中可能需要一些额外的业务逻辑(例如,如果您需要排除某些状态,例如取消的项目),但这应该会让您非常接近。
UPDATE zorder
SET zorder.status = 3,
zorder.total =
(SELECT SUM(Y.EXTENDED_PRICE)
FROM ZORDERLINE Y
WHERE Y.order_id = zorder.order_id)
WHERE zorder.status = 1
and not exists
(select 1
from zorderline z
where z.order_id = zorder.order_id
and z.status = 1)