DELETE 语句部分删除数据

DELETE statement deleting data partially

当我在 DB2 中执行以下查询时,它并没有立即删除数据。

我有 800 条记录,其中每 2 条记录都是重复的,我想删除 2 条记录中的 1 条记录,这样它将在数据库中留下 400 条记录。

下面是 RESERVATION_NUMBER 的示例。

DELETE 
FROM   reservation_number 
WHERE  reservation_id IN (SELECT reservation_id 
                          FROM   (SELECT ROW_NUMBER() 
                                           OVER() AS RN, 
                                         msr1.reservation_number, 
                                         msr1.reservation_id, 
                                         msr1.used_flag 
                                  FROM   reservation_number msr1, 
                                         reservation_number msr2 
                                  WHERE 
              msr1.reservation_number = msr2.reservation_number 
              AND msr1.reservation_id <> msr2.reservation_id 
                                  ORDER  BY msr1.reservation_number) 
                          WHERE  Mod (rn, 2) = 0 
                          ORDER  BY reservation_number) 

如果我多次执行这个查询,它会删除完整的数据。正在以以下方式删除数据 -

400, 168, 076, 038, 019, 003, 001

我得到了修复。我在 OVER() 中缺少一个参数。

这是正确的查询

DELETE
FROM
    RESERVATION_NUMBER
WHERE
    RESERVATION_ID IN (
    SELECT
        RESERVATION_ID
    FROM
        (
        SELECT
            ROW_NUMBER() OVER(ORDER BY msr1.RESERVATION_NUMBER) AS RN,
            msr1.RESERVATION_NUMBER,
            msr1.RESERVATION_ID,
            msr1.USED_FLAG
        FROM
            RESERVATION_NUMBER msr1 ,
            RESERVATION_NUMBER msr2
        WHERE
            msr1.RESERVATION_NUMBER = msr2.RESERVATION_NUMBER
            AND msr1.RESERVATION_ID <> msr2.RESERVATION_ID
        ORDER BY
            msr1.RESERVATION_NUMBER )
    WHERE
        MOD (RN,2)=1 
    ORDER BY
        RESERVATION_NUMBER )

这不是更容易吗?

DELETE FROM (
    SELECT ROW_NUMBER() OVER(PARTITION BY RESERVATION_NUMBER 
                             ORDER BY     RESERVATION_ID     ) AS RN
    FROM
        RESERVATION_NUMBER
) WHERE RN > 1