0
我想正常化一个大的数据集,我已经建立了一个所有的关系表,称为应用程序(earances)。然后,我循环遍历另一个表来构建一个包含重复项的临时表,其中MasterID是我想保留的表。打开同一表两次更新
然后我尝试更新应用表,换任何重复的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变体。
感谢您的帮助
还没有工作,例如PlayerID 767仍然在存在应用程序表,它应该被替换为1 –
第一个查询有效,但第二个不是 –
@CraigHarley。 。 。这很好奇。我希望这两个工作。 –