在更新中打开相同的表两次

时间:2016-10-02 15:37:39

标签: mysql sql

我正在尝试规范化大型数据集,我已经构建了一个包含所有关系的表,称为App(earances)。然后我遍历另一个表来构建一个包含重复项的临时表,MasterID就是我要保留的那个。

重复表中的数据如下所示: enter image description here

然后我尝试更新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变体。

感谢您的帮助

1 个答案:

答案 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