2016-10-02 92 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。 。 。這很好奇。我希望這兩個工作。 –