我正在尝试规范化大型数据集,我已经构建了一个包含所有关系的表,称为App(earances)。然后我遍历另一个表来构建一个包含重复项的临时表,MasterID就是我要保留的那个。
然后我尝试更新app表,交换相应主ID的任何重复ID,但我收到错误:无法重新打开表:'d'。
以下是代码:
DROP TABLE IF EXISTS Duplicates;
CREATE TEMPORARY TABLE Duplicates (
MasterID int NOT NULL,
DuplicateID int NOT NULL
);
INSERT INTO Duplicates(MasterID, DuplicateID)
SELECT p1.PlayerID as MasterID, p2.PlayerID as DuplicateID
FROM Player p1
LEFT JOIN Player p2 on p1.Name = p2.Name
WHERE p1.name = p2.name
AND p1.PlayerID < p2.PlayerID
ORDER BY p1.PlayerID;
UPDATE app a
SET a.PlayerID = ( SELECT d.MasterID FROM Duplicates d WHERE a.PlayerID = d.DuplicateID LIMIT 1 )
WHERE a.PlayerID in (SELECT d.DuplicateID FROM Duplicates d);
DELETE Player p
WHERE PlayerID = ( SELECT d.DuplicateID FROM Duplicates d )
DROP TABLE Duplicates;
问题在于更新查询,我已将其他查询放入其中以便您可以更好地了解正在发生的事情,我认为CTE在这里会更好但我不知道如何做到这一点。我现在在MYSQL中运行它,但我可以使用另一种SQL变体。
感谢您的帮助
答案 0 :(得分:1)
一种方法使用join
:
UPDATE app a JOIN
Duplicates d
ON a.PlayerID = d.DuplicateID
SET a.PlayerID = d.MasterID;
如果给定a
的{{1}}中有多个匹配项, d
将从d
中的任意行设置。
我认为让多个可能的行更新单行并不是一个好主意,因此您可以在a
之前进行汇总:
join