2017-10-15 60 views
0

我正在修復舊的數據庫結構。舊錶中存儲的圖像(我已經簡化這個有很多):SQL更新行指向單個密鑰,然後刪除重複項

遊戲

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

該表允許有相同的「名稱」行,這意味着相同的「圖片」的存在。因此,我們通過存儲重複圖像浪費空間。我們決定將圖片/圖片移動到自己的表格中。

遊戲

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

圖片

PictureId, int 
Picture, image 

我有SQL命令來完成對圖像列移動到新表(和圖像數據本身)的一切,但我仍然有Game行指向他們自己的圖片行(通過Game.PictureId)相同的「名稱」。我希望所有具有相同「名稱」的遊戲列指向單個圖片記錄。

將所有具有相同「名稱」的遊戲行指向單個圖片行的SQL命令是什麼,然後刪除重複的圖片行,因爲沒有遊戲記錄再使用它們了?

謝謝。

+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

最美妙!作品最優秀。非常感謝。 – user2737646

+1

使用SQL 2016(以及其他prev版本)的另外一個注意事項是,WITH語句中出現「附近的語法不正確」。解決方案是以分號開頭,「WITH ...」。這個解決方案被發現[鏈接](https://stackoverflow.com/questions/2746916/getting-an-odd-error-sql-server-query-using-with-clause) – user2737646

0

如果它沒有真正的問題,其重複的圖像的Game行必點,你可以使用像

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

此之後,你可以繼續刪除Picture行,而不指向他們的任何比賽。

+0

危險;沒有工作。它將每個Game.PictureId設置爲存在的所有PictureId中最小的一個。你不能做更新遊戲[g]。 – user2737646