2016-10-02 91 views
0

我想正常化一个大的数据集,我已经建立了一个所有的关系表,称为应用程序(earances)。然后,我循环遍历另一个表来构建一个包含重复项的临时表,其中MasterID是我想保留的表。打开同一表两次更新

在重复表中的数据是这样的: enter image description here

然后我尝试更新应用表,换任何重复的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变体。

感谢您的帮助

回答

1

一种方法是使用join

UPDATE app a JOIN 
     Duplicates d 
     ON a.PlayerID = d.DuplicateID  
    SET a.PlayerID = d.MasterID; 

a将在任意行中d获取设置,如果在d对于给定a多个匹配。

我想这是不是一个好主意,有多个可能的行更新单行,所以你可以聚集join前:

UPDATE app a JOIN 
     (SELECT d.DuplicateID, MAX(d.MasterId) as MasterId 
     FROM Duplicates d 
     GROUP BY d.DuplicateID 
     ) d 
     ON a.PlayerID = d.DuplicateID  
    SET a.PlayerID = d.MasterID; 
+0

还没有工作,例如PlayerID 767仍然在存在应用程序表,它应该被替换为1 –

+0

第一个查询有效,但第二个不是 –

+0

@CraigHarley。 。 。这很好奇。我希望这两个工作。 –