2017-10-15 15 views
0

私は古いデータベース構造を修正しています。古いテーブルは、画像を保存して(私が簡略化されてきたこのロット):SQLが単一キーを指すように行を更新した後、重複を削除します

ゲーム

GameId, int 
Name, varchar(50) 
Picture, image 

テーブルが同じ「名前」を持つ行を許可し、それは同じ「ピクチャー」は存在していたもので。私たちは重複した画像を保存することによってスペースを無駄にしていました。 Picture/imageを独自のテーブルに移動することに決めました。

ゲーム

GameId, int 
Name, varchar(50) 
PictureId, int 

ピクチャー

PictureId, int 
Picture, image 

私は、SQLは、新しいテーブル(および画像データそのもの)に画像列を移動についてのすべてを行うためのコマンド持っていますが、私はまだGame.PictureIdを介して、自分のピクチャ行を指している同じ "名前"を持つGame行を持っています。私は同じ "名前"を持つすべてのゲームの列が単一のピクチャ・レコードを指していることを望む。

同じ "名前"を持つすべてのゲーム行を1つのピクチャ行にポイントし、ゲームレコードがそれ以上使用しないため、重複するピクチャ行を削除するSQLコマンドとは何ですか?

ありがとうございました。それは本当にGame行が指すようになりますし、重複画像のどの問題ではない場合

+0

あなたはこれまでに何をしようとしたのですか?サンプルデータと希望の結果をご覧ください。 – Sami

答えて

2

フィドルリンク:http://sqlfiddle.com/#!6/a2085/1

;WITH cte AS (
    SELECT name, max(pictureid) as pid 
    FROM game 
    GROUP BY name 
) 
UPDATE game 
    SET pictureid = b.pid 
    FROM game a 
     INNER JOIN 
     cte b ON a.name = b.name; 

delete from picture where pictureid not in (
select pictureid from game); 
+0

Beautimous maximous!最も優れた作品。どうもありがとう。 – user2737646

+1

SQL 2016(およびその他の以前のバージョン)を使用して、もう1つの注意点として、WITH文の「誤った構文の近くにあります。解決策はセミコロンで始まるステートメントから始めることでした。 "; WITH ..."。この解決策が見つかりました[リンク](https://stackoverflow.com/questions/2746916/getting-an-odd-error-sql-server-query-using-with-clause) – user2737646

0

、あなたはそれらを指して任意のゲームなしPicture行を削除するために進むことができ、この後

UPDATE Game g 
SET PictureId = 
    (SELECT MIN(g2.PictureId) from Game g2 where g2.Name = g.Name) 

ようなものを使用することができます。ここ

+0

危険です。労働者はいません。これは、すべてのGame.PictureIdを、存在するすべてのPictureIdのうちの最小値に設定します。 UPDATEゲーム[g]はできません。 – user2737646

関連する問題