2017-05-29 6 views
0

displayName列に「unique」制約を追加したテーブルがあります。私は、一意でないdisplayNameをnullに設定する移行を作成しようとしています。そのため、displayNameには下位のユーザーIDをそのまま残します。 「『FROM:』または近くで構文エラーエラー」私は戻って取得しています移行を実行しようとするとユニーク制約が追加された列の重複値の削除

UPDATE "User" SET "displayName" = NULL 
      WHERE id IN (SELECT id, 
         FROM (SELECT id, 
            ROW_NUMBER() OVER (partition BY "displayName" ORDER BY id) AS rnum 
           FROM "User") t 
         WHERE t.rnum > 1); 

:ここに私のクエリです。

おかげ

+0

使用しているデータベースであなたの質問にタグを付けてください。また、サンプルデータと望ましい結果は、あなたがしていることを伝えるのに役立ちます。 –

+3

'、'サブクエリの後のid。 –

答えて

1

はなぜ同じようにこれを書いていない:あなたが使用しているどのようなデータベース

UPDATE "User" 
    SET "displayName" = NULL 
    WHERE id > (SELECT MIN(u2.id) 
       FROM "User" u2 
       WHERE u2."displayName" = u."displayName" 
       ); 

、これも"User"("displayName", id)にインデックスを利用することができるはずです。

0

簡単な方法は、

WITH X AS 
(
SELECT id 
    , [displayName] 
    , ROW_NUMBER() OVER (partition BY [displayName] ORDER BY id) AS rnum 
FROM [User] 
) 
UPDATE X 
SET [displayName] = NULL 
WHERE rnum > 1 

OR

UPDATE X 
SET [displayName] = NULL 
FROM (
     SELECT id 
      , [displayName] 
      , ROW_NUMBER() OVER (partition BY [displayName] ORDER BY id) AS rnum 
     FROM [User] 
    ) x 
WHERE rnum > 1 

とサイドノート、上の固有の制約に....、このような何かをCTEまたはサブクエリを使用することです表示名は本当に:S ....

+0

上司の命令。間違いなく私の考えだった。 – user3143105

+0

SQL識別子では角かっこが無効であることに注意してください。そして、その質問は、特定のDBMS製品ではなく 'sql'タグが付けられています(また、質問には標準の二重引用符も使用されます) –

関連する問題