2017-10-15 16 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