【问题标题】:Oracle: Update based on cyclical selectOracle:基于循环选择的更新
【发布时间】:2021-02-04 14:09:51
【问题描述】:

我很难找出下表的 oracle 查询,我必须根据以下条件进行更新。

要求:

这里的 key 是 account_number 基于 account_number ,如果该帐户有多个 user_numbers 并且在这些 user_numbers 之外,如果任何 user_number 没有与 key 以外的任何其他帐户相关联,则将该 user_number stat 更新为'I',保留有多个账户的user_number(可以有key和其他账户)。如果账户只有一个用途,不要做任何事情。

create table cust_account(user_number number(10),account_number number(10),stat char(1));

Insert into cust_account(user_number,account_number,stat)values(123,345,'A')
Insert into cust_account(user_number,account_number,stat)values(226,345,'A')
Insert into cust_account(user_number,account_number,stat)values(226,456,'A')
Insert into cust_account(user_number,account_number,stat)values(556,767,'A')

提交;

输入:

预期输出; 这里 account_number 345 有两个 user_numbers,其中 123 个用户只有一个帐户因此停用。 而且767只有一种用途,所以更新时甚至不要选择它。

提前感谢您的帮助。

【问题讨论】:

    标签: sql oracle oracle11g sql-update subquery


    【解决方案1】:

    如果你想要一个update 查询,那么我会推荐一个相关子查询:

    update cust_account ca
    set stat = 'I'
    where stat = 'A' 
      and exists (select 1 
                  from cust_account ca1 
                  where ca1.stat = 'A'
                    and ca1.account_number = ca.account_number 
                    and ca1.user_number > ca.user_number)
    

    如果您想要select,请使用row_number():

    select ca.*,
        case when stat = 'A' and row_number() over(partition by account_number, stat order by user_number desc) > 1
            then 'I'
            else stat
        end new_stat
    from cust_account ca
    

    【讨论】:

    • 在这里,当我使用我的帐号作为 767 时,它正在更新甚至不相关的 user_numbers。更新 cust_account ca set stat = 'I' where stat = 'A' and exists (select 1 from cust_account ca1 where ca1.account_number = 767 and ca1.stat = 'A' and ca1.user_number > ca.user_number).期望是应该不变,因为这个账号只有一个user_number
    • @JohnDoe:这不是如何使用查询。如果要过滤,则在外部查询中进行:update cust_account ca set stat = 'I' where stat = 'A' and ca.account_number = 767 and exists ( select 1 from cust_account ca1 where ca1.stat = 'A' and ca1.account_number = ca.account_number and ca1.user_number > ca.user_number )
    • 这里的键是 account_number 如果我发送 345 它应该只更新 'I' 123 因为它有两个用户,其中一个有多个帐户,如果我发送 767 它不应该更新 556 用户或任何其他用户,因为它只有一个用户帐户。
    • @JohnDoe:这按预期工作。你可以在这个 db fiddle 中玩耍:dbfiddle.uk/…
    • 如何只为 select 编写查询,该查询返回 user_number 这两个用户中只有一个用户,并且需要 account_number 键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2014-10-18
    相关资源
    最近更新 更多