Oracle с удалением по номеру строки - PullRequest
2 голосов
/ 27 июля 2011

Я пишу процедуру, которая удаляет старые строки по дате их просмотра:

;WITH pv AS (
    SELECT
        RN = ROW_NUMBER() OVER (ORDER BY viewed DESC)
    FROM
        previouslyViewed
    WHERE
        userId = @userId
)
DELETE FROM pv WHERE RN >= 10

Это работает в SQL Server, но не в Oracle.

Oracle не поддерживает WITHУДАЛИТЬ комбинацию.Также он не поддерживает комбинацию DELETE ORDER BY (которую теоретически можно использовать с rownum для достижения того же результата).Я попытался создать временное представление с помощью rownum и удалить из него, но я получаю ошибку Oracle - похоже, вы не можете удалить из представления при использовании rownum.

У кого-нибудь есть указатели?

1 Ответ

4 голосов
/ 27 июля 2011

Вы можете сделать это вместо этого:

DELETE FROM previouslyViewed WHERE pkcol IN
( SELECT pkcol FROM
  (
      SELECT pkcol, ROW_NUMBER() OVER (ORDER BY viewed DESC) RN
      FROM previouslyViewed
      WHERE userId = :userId
  )
  WHERE RN >= 10
);

(изменив pkcol на столбцы первичного ключа таблицы)

...