【问题标题】:SQL Query to find distinct records and Update a tableSQL 查询以查找不同的记录并更新表
【发布时间】:2017-07-14 02:38:41
【问题描述】:

我有一个表 ABC,它有以下记录 -

  INVC_NUM    | LINE_NUMBER  |  ORGANIZATION_ID  | STATUS    |  DATE

  0000034454       1             521                 Validated   09/09/2016 

  0000034454       2             521                 Validated    04/09/2016 

  0000034410       1             521                 Validated    04/09/2016

  0000034410       2             521                 notValidated    04/09/2016

  0000034410       3             521                 notValidated   04/09/2016

  0000034410       4             521                 Validated   04/09/2016

现在我需要更新一个包含以下列的表 XYZ

INVC_NUM     |   ORGANIZATION_ID   | date

0000034454   |   521               | 09/09/2016    
0000034410   |   521               | null

只要特定 INVC_NUM 和组织 ID 的所有 Line_number 的状态都是“全部”验证(状态),那么我们需要使用 sysdate 更新 XYZ。

每当特定 INVC_NUM 和 organization_id 的所有 Line_number 的状态都不是已验证(状态)时,我们需要将 XYZ 更新为 NULL。 XYZ 对每个 INVC_NUM 和 Org_id 都有唯一的记录。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    为了了解 INVC_NUM 和 organization_id 的 所有 状态是否有效,请查看是否找到无效状态:

    update xyz
    set date =
    case when not exists
      (
        select *
        from abc
        where abc.invc_num = xyz.invc_num
          and abc.organization_id = xyz.organization_id
          and abc.status = 'notValidated'
      ) then sysdate 
    end;
    

    (省略ELSE 分支默认为null,这是我们想要的。如果您认为它更具可读性,请将then sysdate end 更改为then sysdate else null end。)

    【讨论】:

    • 谢谢托尔斯滕。我的要求有一个小的变化。如果我想从另一列获取 max(date) 并更新该日期而不是使用 sysdate,我该如何实现?
    • 我会说用(select max(datecolumnname) from tablename)替换上面查询中的sysdate
    【解决方案2】:

    您可以使用相关子查询来做到这一点。它使用聚合返回一行:

    update xyz
        set date = (select (case when count(*) = 0 then sysdate end)
                    from abc
                    where abc.status = 'NotValidated' and
                          abc.invc_num = xyz.invc_num and
                          abc.organization_id = xyz.organization_id
                   );
    

    【讨论】:

    • 谢谢戈登。我是否需要在 where 子句中也使用 Organization_id?
    • @GordonLinoff,世界上有没有你可以解决的 sql 查询。向 SQL 之神低头。
    • @beckham 是的。您也必须在 where 子句中使用 Organization_id。
    • @贝克汉姆。 . .也许。如果一张发票可以在多个组织中,那么您需要包含它。
    • 我不明白。不应该统计'notValidated'条记录,看看所有条记录是否被验证?
    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多