在另一个表中进行更新之前适用于多行的条件

时间:2013-12-09 20:50:15

标签: sql

我有两个表,一个表通过外键链接到另一个表。

我需要创建一个更新语句,它将根据表2中的条件更新表一。但是,条件必须与表2中的一行或多行有关。

示例 - 表二 订单A. 第1行=打开(状态栏) 第2行=关闭(staus列)

当第1行也关闭时(相同的订单号 - 在这种情况下为A),满足条件,然后在另一个表中关闭(更新为关闭)订单。表上只有标题信息(没有多行)。

在更新第一个表之前,我遇到了纠正第二表中多行(必须关闭所有行)的条件的问题。

任何有用的建议都将不胜感激。

1 个答案:

答案 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)