SQL查找表中的所有重复项,删除它们,并更新链接表中的外键

时间:2013-08-16 16:10:38

标签: sql db2 toad

我有2个表,一个PROMOTION表和一个PRIZE表。 PRIZE表包含主键PRIZEID以及其他两个字段:COSTPRIZENAMEPROMOTION表包含几个字段以及将两个表链接在一起的外键PRIZEID

现在我的PRIZE表包含重复的条目(重复的是任何具有相同成本和prizename的行)。我想要做的是找到PRIZE表中的所有重复项,删除所有重复项(基本上为每个cost-prizename对留下一个唯一行)并在PROMOTION表中更新外键反映这些变化。

例如,在我的奖品表中,我有

prizeid             cost             prizename
1                   100                TV
2                    50                Computer
3                   100                TV
4                    50                Computer
5                    200               Book

,促销表包含

promotionid ...  prizeid
1                  1
2                  3
3                  2

我希望奖品表最终看起来像这样

prizeid             cost             prizename
1                   100                TV
2                    50                Computer
5                    200               Book

和促销表看起来像

promotionid ...  prizeid
1                  1
2                  1
3                  2

我不完全确定如何继续。有什么想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

我认为你必须分两步完成:

(1)首先,您需要更新PROMOTION table中指向将被删除到等效行的行的所有条目。

UPDATE promotion p SET 
    prizeid = 
        (SELECT prizeid FROM prize 
            WHERE 
                cost = (SELECT cost FROM prize WHERE prizeid = p.prizeid) 
            AND 
                prizename = (SELECT prizename FROM prize WHERE prizeid = p.prizeid) 
            ORDER BY prizeid ASC LIMIT 1
        );

(2)然后,从PRIZE table删除所有重复的行。

DELETE FROM prize 
    WHERE prizeid NOT IN 
        (SELECT tab.pi FROM 
            (SELECT DISTINCT prizeid AS pi FROM prize GROUP BY prizename, cost)
        AS tab);

阻止这种情况再次发生的一种方法是将costprizename设为主要关键字,而不是prizeid

答案 1 :(得分:0)

我们假设您只想保留每个费用+ PrizeName组合的第一个实例。你可以用这个:

UPDATE Promotion
SET PrizeId = A.FirstPrizeIdPerCostPrizeNameCombination

FROM
    Promotion AS P 
    INNER JOIN 
    (
    SELECT 
        PrizeId, Cost, PrizeName,
        [FirstPrizeIdPerCostPrizeNameCombination] = First_Value(PrizeId) OVER (PARTITION BY Cost,PrizeName ORDER BY PrizeId)
    FROM
        Prize
    ) AS A ON A.PrizeId = P.PrizeId