Оператор DELETE, удаляющий данные частично - PullRequest
0 голосов
/ 02 июня 2019

Когда я выполняю приведенный ниже запрос в DB2, он не удаляет данные сразу.

У меня есть 800 записей, и каждые 2 записи дублируются, и я хочу удалить 1 запись из 2 записей, чтобы в БД оставалось 400 записей.

Ниже приведен пример RESERVATION_NUMBER.

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Разве это не будет проще?

DELETE FROM (
    SELECT ROW_NUMBER() OVER(PARTITION BY RESERVATION_NUMBER 
                             ORDER BY     RESERVATION_ID     ) AS RN
    FROM
        RESERVATION_NUMBER
) WHERE RN > 1
0 голосов
/ 02 июня 2019

Я получил исправление. Я пропустил параметр в 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 )
...