Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在另一个表中进行更新之前应用于多行的条件_Sql - Fatal编程技术网

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

Sql 在另一个表中进行更新之前应用于多行的条件,sql,Sql,我有两个表,一个表通过外键链接到另一个表 我需要创建一个update语句,根据表2中的条件更新表1。但是,条件必须与表2中的一行或多行相关 示例-表二 订购 第1行=打开状态列 第2行=闭合的staus列 当第1行也关闭时,相同的订单号-在本例中为A,满足条件,因此订单将在另一个表中更新为关闭。上的表只有标题信息,没有多行 我在纠正一个条件时遇到了问题,该条件会查看表2中的多行。在对表1进行更新之前,必须关闭所有行 任何有用的建议都将不胜感激。假设1键名为ordernum,2每个table1条目

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

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

示例-表二 订购 第1行=打开状态列 第2行=闭合的staus列

当第1行也关闭时,相同的订单号-在本例中为A,满足条件,因此订单将在另一个表中更新为关闭。上的表只有标题信息,没有多行

我在纠正一个条件时遇到了问题,该条件会查看表2中的多行。在对表1进行更新之前,必须关闭所有行


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

假设1键名为ordernum,2每个table1条目在table2中至少有一个条目,这是一个简单的查询,应该适合您。基本上,NOTEEXISTS子句测试第二个表中是否没有打开的行

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行的扩展_价格求和,可以找到总数。在第一个子查询中可能需要一些额外的业务逻辑,例如,如果您需要排除某些状态,如取消的项目,但这应该会让您非常接近

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)

谢谢大卫-我应该能够把这一点纳入我的声明中。非常感谢您的帮助。效果非常好!David-是否可以在此基础上添加某种聚合函数-这将对一个表中的行求和,并用总和更新另一个表???再次感谢David-我想对扩展_价格求和,每行一个。我试图用sum来代替count,但没法用。有什么建议吗?非常感谢你的帮助!!这就是我到目前为止所做的-您的解决方案,但插入我的表名和列名,试图将每个相关行的扩展_价格和相同的顺序相加。更新zorderline SET zorderline.status=3,zorderline.SUMEXTENDED_PRICE AS TOTAL=从ZORDER Y中选择SUM1,其中Y.order_id=zorderline.order_id,其中zorderline.status=1且不存在从ZORDER z中选择1,其中z.status=1;