我有2个表,一个PROMOTION
表和一个PRIZE
表。 PRIZE
表包含主键PRIZEID
以及其他两个字段:COST
和PRIZENAME
。 PROMOTION
表包含几个字段以及将两个表链接在一起的外键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
我不完全确定如何继续。有什么想法吗?
提前致谢!
答案 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);
阻止这种情况再次发生的一种方法是将cost
和prizename
设为主要关键字,而不是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