【问题标题】:How to update a record by checking a value in another record in same table如何通过检查同一表中另一条记录中的值来更新记录
【发布时间】:2019-10-21 16:54:00
【问题描述】:

我有一张桌子:

ID      DATE            RANGE       STATUS
--------------------------------------------
123     30-SEP-2019     000         C
123     30-SEP-2019     001         NULL
345     25-SEP-2019     000         C
345     30-SEP-2019     001         NULL
567     30-SEP-2019     000         C
567     30-SEP-2019     001         NULL
789     27-SEP-2019     000         C
789     30-SEP-2019     001         NULL

具有相同 ID(例如 123)的记录被视为具有不同 RANGE 的相同记录。 我需要将 001 RANGE 记录的状态更新为 Y,其中 000 RANGE 记录的日期应为 30-SEP-2019。

例如。更新查询应将 ID - '123' 和 RANGE - '001' 的记录的状态更新为'Y',因为对于 ID - '123' 和 RANGE - '000' 记录的 DATE 是'30-SEP- 2019 年'。它还应该使用 ID - 567 更新 001 RANGE 记录的状态。

它不应更新 ID 789 和 345 的 001 RANGE 的状态,因为那些 000 RANGE 记录的 DATE 不等于 30-SEP-2019。

我怎样才能做到这一点?

【问题讨论】:

    标签: sql sql-server sybase


    【解决方案1】:

    想到一个带有过滤的相关子查询:

    update t
        set status = (select t2.status
                      from t t2
                      where t2.id = t.id and t2.range = '000'
                     )
        where date = '2019-09-30' and range = '001';
    

    【讨论】:

    • 感谢您的回答,但很抱歉问题错了,我需要将状态更新为 Y
    【解决方案2】:

    或者,如果 Gordon 的回答是正确的,您可以使用 JOIN

    UPDATE T1
    SET status = T2.Status
    FROM YourTable T1
         JOIN YourTable T2 ON t1.id = t2.id
    WHERE T1.[date] = '20190930'
      AND T1.range = '001'
      AND T2.range = '000';
    

    【讨论】:

      【解决方案3】:

      使用自联接进行更新:

      update t
      set status = 'Y'
      from tablename t inner join tablename tt
      on t.id = tt.id and t.date = tt.date and t.status is null and tt.status is not null
      

      您可以在 WHERE 子句中专门为要更改的范围添加条件,例如:

      WHERE t.range = '001' and tt.range = '000'
      

      请参阅demo
      结果:

       ID | DATE        | RANGE | STATUS
      --: | :---------- | ----: | :-----
      123 | 30-SEP-2019 |     0 | C     
      123 | 30-SEP-2019 |     1 | Y     
      345 | 25-SEP-2019 |     0 | C     
      345 | 30-SEP-2019 |     1 | null 
      567 | 30-SEP-2019 |     0 | C     
      567 | 30-SEP-2019 |     1 | Y     
      789 | 27-SEP-2019 |     0 | C     
      789 | 30-SEP-2019 |     1 | null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        相关资源
        最近更新 更多