Замена предложения IN на EXISTS приводит к неожиданным результатам - PullRequest
0 голосов
/ 16 мая 2018

Имеется простая таблица lieu_horaire с:

+ id_horaire (numeric)
+ id_lieu (numeric)
+ horaire (timestamp)

В данный момент следующий запрос работает нормально:

         DELETE FROM lieu_horaire where id_horaire IN ( 
         SELECT id_horaire "+
         FROM ( 
                SELECT id_horaire,
                ROW_NUMBER() OVER (PARTITION BY id_lieu order by horaire desc) AS line_number
                FROM lieu_horaire
        ) as sr
        WHERE sr.line_number > 10);

Но из-за масштабируемости я бы хотел заменить предложение IN на EXISTS '... WHERE EXISTS(... '. Но с существует, вместо удаления правильных строк, он удаляет все строки, как если бы выражение '... WHERE sr.line_number...' не присутствовало.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Убедитесь, что вы присоединились к столбцу при использовании существует, что-то вроде этого:

DELETE FROM lieu_horaire where exists ( 
     SELECT id_horaire
     FROM ( 
            SELECT id_horaire,
            ROW_NUMBER() OVER (PARTITION BY id_lieu order by horaire desc) AS line_number
            FROM lieu_horaire
    ) as sr
    WHERE sr.line_number > 10 **and lieu_horaire.id_horaire=sr.id_horaire**);
0 голосов
/ 16 мая 2018

Вот упрощение с использованием NOT IN:

DELETE FROM lieu_horaire lh
    WHERE lh.id_horaire NOT IN (SELECT lh2.id_horaire
                                FROM lieu_horaire lh2
                                WHERE lh2.id_lieu = lh.id_lieu
                                ORDER BY lh2.horaire DESC
                                LIMIT 10
                               );

Однако я не знаю, что производительность будет намного лучше.Для любой версии вам нужен индекс на lieu_horaire(id_lieu, horaire).

Если нужно удалить большое количество строк, я мог бы предложить truncate / insert вместо.

...