CTE в Oracle не работает без оператора select - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу удалить дубликаты.Но в Oracle Sql developer, когда я использую следующее с CTE, это показывает мне ошибку.Если я использую Select, то это работает только тогда, но я хочу удалить из таблицы, используя представление.

WITH PECCTE AS ( 
SELECT QT_PEC_RATE.*, ROW_NUMBER() OVER(PARTITION BY QT_PEC_RATE.UWC_CODE, AGE ORDER BY QT_PEC_RATE.UWC_CODE) AS ROWNUMBER 
FROM QT_PEC_RATE WHERE NLG_OPTION='STD' AND GENDER='M' AND CNTRY_RATING='C' AND GMCR_RATE=2
)
DELETE FROM PECCTE WHERE ROWNUMBER>1;

показывает ошибку, что отсутствует оператор выбора.это работает только со следующими

WITH PECCTE AS ( 
SELECT QT_PEC_RATE.*, ROW_NUMBER() OVER(PARTITION BY QT_PEC_RATE.UWC_CODE, AGE ORDER BY QT_PEC_RATE.UWC_CODE) AS ROWNUMBER 
FROM QT_PEC_RATE WHERE NLG_OPTION='STD' AND GENDER='M' AND CNTRY_RATING='C' AND GMCR_RATE=2
)
SELECT * FROM PECCTE;

Как я могу удалить из таблицы, используя это представление.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

При условии, что у вас есть уникальный P_ID в таблице:

DELETE FROM QT_PEC_RATE 
WHERE  P_ID in (
         WITH PECCTE AS ( 
           SELECT ID, ROW_NUMBER() OVER(PARTITION BY UWC_CODE, AGE ORDER BY UWC_CODE) ROWNUMBER 
           FROM   QT_PEC_RATE 
           WHERE  NLG_OPTION='STD' 
           AND    GENDER='M' 
           AND    CNTRY_RATING='C' 
           AND    GMCR_RATE=2
         )
         SELECT P_ID
         FROM   PECCTE
         WHERE  ROWNUMBER > 1
       )
0 голосов
/ 08 февраля 2019

Это не сработает (как вы видели).Посмотрите, можете ли вы переписать его как

delete from peccte
where some_id in (select id 
                  from (select qtpec_rate.*, row_number()... as rownumber   --> this is your CTE
                        from qt_pec_rate
                        where ...
                       )
                  where rownumber > 1
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...