2017-11-22 7 views
0

重複を削除するためにCTEを使用する場合は、元のテーブルから行を削除します。どうしたの?重複を削除するためにcteを使用すると、元のテーブルから行が削除される方法

一部の値に対してCTEを更新すると、元のテーブルに反映されないのはなぜですか?例えばのために

CREATE TABLE TABLE_DUPLICATEREMOVALTEST 
(
    ID INT,NAME VARCHAR(20) 
) 

INSERT INTO TABLE_DUPLICATEREMOVALTEST 
SELECT 1,'hina' 
union all 
SELECT 1,'hina' 
union all 
SELECT 1,'hina' 
union all 
SELECT 2,'Tina' 
union all 
SELECT 3,'Mina' 
union all 
SELECT 4,'Lina' 
union all 
SELECT 5,'Sina' 

-- To test update 
alter table TABLE_DUPLICATEREMOVALTEST 
add Row_no INT 


;WITH CTE (rNO,Row_no) 
    AS 
    (
     SELECT ROW_NUMBER() OVER(PARTITION BY ID,NAME ORDER BY ID, NAME) AS rNO, id 
     FROM TABLE_DUPLICATEREMOVALTEST 
) 
    UPDATE CTE SET Row_no = 100 WHERE Rno = 1 ---Not updating column in the main table 
--DELETE FROM CTE WHERE Rno ! = 1 ---but this removes rows from main table 

    SELECT * FROM TABLE_DUPLICATEREMOVALTEST 

誰でも助けることができますか?私はそれを見つけたが満足できるものは何も見つかりませんでした。

+0

更新が有効であるはずです。自分の正面に正しいデータがあることは確かですか? –

+0

Row_no列を更新していません。代わりに、Row_noエイリアスにidを渡しているため、ID列 –

+0

が更新されています。元のRow_no列を追加して部品を選択し、部品をWITH CTE(rNO、id、Row_no)に変更します。 –

答えて

0

CTEの結果を使用してメインテーブルに参加し、その方法で削除を実行できます。私はあなたのサンプルを一時テーブルを使用するように変更し、CTEとdeleteステートメントのコードを更新しました。

CREATE TABLE #TABLE_DUPLICATEREMOVALTEST (ID INT, NAME VARCHAR(20)); 

INSERT INTO #TABLE_DUPLICATEREMOVALTEST 
SELECT 1, 'hina' 
UNION ALL 
SELECT 1, 'hina' 
UNION ALL 
SELECT 1, 'hina' 
UNION ALL 
SELECT 2, 'Tina' 
UNION ALL 
SELECT 3, 'Mina' 
UNION ALL 
SELECT 4, 'Lina' 
UNION ALL 
SELECT 5, 'Sina'; 

ALTER TABLE #TABLE_DUPLICATEREMOVALTEST ADD Row_no INT; 

WITH CTE -- removed the column definitions 
AS (SELECT ROW_NUMBER() OVER (PARTITION BY ID, NAME ORDER BY ID, NAME) AS rNO, 
      ID 
    FROM #TABLE_DUPLICATEREMOVALTEST 
    ) 
-- added the delete with a join to the cte 
DELETE td 
FROM #TABLE_DUPLICATEREMOVALTEST AS td 
    INNER JOIN CTE 
     ON td.ID = CTE.ID 
WHERE CTE.rNO != 1; 

SELECT * 
FROM #TABLE_DUPLICATEREMOVALTEST AS td; 

DROP TABLE #TABLE_DUPLICATEREMOVALTEST; 
関連する問題