没有选择语句,Oracle中的CTE无法正常工作

时间:2019-02-08 06:00:24

标签: sql oracle

我要删除重复项。但是在Oracle Sql开发人员中,当我将以下内容与CTE一起使用时,它显示了错误。如果我使用“选择”,则只能使用它,但是我想使用视图从表中删除。

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 :(得分:1)

假设表中有唯一的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
       )

答案 1 :(得分:0)

它不起作用(如您所见)。看看是否可以将其重写为

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
                 );