Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 删除sql中的重复项并相应修改关系表_Mysql_Sql_Plsql_Mysql Workbench - Fatal编程技术网

Mysql 删除sql中的重复项并相应修改关系表

Mysql 删除sql中的重复项并相应修改关系表,mysql,sql,plsql,mysql-workbench,Mysql,Sql,Plsql,Mysql Workbench,我有三张桌子: 菜单选项卡有列(菜单id、菜单描述) “项目”选项卡具有列(项目id、项目名称、项目描述、项目价格) 菜单项具有列{(菜单项选项卡项菜单项id-->,它是菜单项id的外键(菜单项选项卡中的主键)),项选项卡项id---它是项目项id的外键(项目项选项卡中的主键))4 将遇到两种类型的重复项 1) 同一菜单中的项目重复\u说明 2) 项目在不同的菜单描述中重复 menu_tab menu_id menu_description 1 lunch 2

我有三张桌子: 菜单选项卡有列(菜单id、菜单描述) “项目”选项卡具有列(项目id、项目名称、项目描述、项目价格) 菜单项具有列{(菜单项选项卡项菜单项id-->,它是菜单项id的外键(菜单项选项卡中的主键)),项选项卡项id---它是项目项id的外键(项目项选项卡中的主键))4

将遇到两种类型的重复项 1) 同一菜单中的项目重复\u说明 2) 项目在不同的菜单描述中重复

menu_tab    
menu_id menu_description
1        lunch
2        dinner
3        Specials


item_tab        
item_id item_description    
1       b 
2       d   
3       g   
4       x   
5       g          delete g
6       d   
7       e   
8       b          delete b
9       x   



menu_has_tab
午餐菜单上有两个鸡肉三明治。午餐菜单上有一个鸡肉三明治,晚餐菜单上有一个

menu_tab    
menu_id menu_description
1        lunch
2        dinner
3        Specials


item_tab        
item_id item_description    
1       b 
2       d   
3       g   
4       x   
5       g          delete g
6       d   
7       e   
8       b          delete b
9       x   



menu_has_tab
菜单选项卡菜单id项目选项卡项目id
1…………1
1…………2
1…………3
1………4
2用3代替5 2………6
3………7
3用1代替8 3……9


删除重复项后,如何使用替换的值更新我的菜单项?

首先,您需要用新值替换菜单选项卡中的重复项

merge into menu_tab dest
using (select *
         from (select item_id, min(item_id) over(partition by item_description) as new_item_id from item_tab)
        where item_id != new_item_id) src
on (dest.item_tab_item_id = src.item_id)
when matched then
    update set dest.item_tab_item_id = new_item_id;
之后,您需要从item表中删除重复项 你可以在那里找到脚本

你们把这个问题标记为plsql,我错误地认为你们是关于Oracle的,对不起。 但是我在MySQL中使用了merge语句
祝您好运

首先,您需要用新值替换菜单选项卡中的副本

merge into menu_tab dest
using (select *
         from (select item_id, min(item_id) over(partition by item_description) as new_item_id from item_tab)
        where item_id != new_item_id) src
on (dest.item_tab_item_id = src.item_id)
when matched then
    update set dest.item_tab_item_id = new_item_id;
之后,您需要从item表中删除重复项 你可以在那里找到脚本

你们把这个问题标记为plsql,我错误地认为你们是关于Oracle的,对不起。 但是我在MySQL中使用了merge语句
祝你好运

我这样做是为了我的表Rout(RoutID,SourceCityID,DestCityID)和Form(FormID,RoutID,…) 我从Rout表中删除了重复的Rout,并在FormTable中更新了RoutID
首先,将重复的行按要比较的列分组,以进行重复

(SELECT * FROM
    Rout,
    (SELECT MIN(RoutID) MinRoutID
    FROM Rout,
        (SELECT SourceCityID,DestCityID
        FROM Rout
        GROUP BY SourceCityID,DestCityID
        HAVING count(*) > 1) AS Duplicates
    WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID
    GROUP BY Rout.SourceCityID,Rout.DestCityID)AS MRCols
WHERE RoutID=MinRoutID)AS DuplicateGroup
(SELECT RoutID,Rout.SourceCityID,Rout.DestCityID FROM Rout,
    (SELECT SourceCityID,DestCityID
    FROM Rout
    GROUP BY SourceCityID,DestCityID
    HAVING count(*) > 1)AS Duplicates
WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID)AS DuplicateDetail
然后获取所有重复的行,不进行分组,并使用将进行重复比较的列

(SELECT * FROM
    Rout,
    (SELECT MIN(RoutID) MinRoutID
    FROM Rout,
        (SELECT SourceCityID,DestCityID
        FROM Rout
        GROUP BY SourceCityID,DestCityID
        HAVING count(*) > 1) AS Duplicates
    WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID
    GROUP BY Rout.SourceCityID,Rout.DestCityID)AS MRCols
WHERE RoutID=MinRoutID)AS DuplicateGroup
(SELECT RoutID,Rout.SourceCityID,Rout.DestCityID FROM Rout,
    (SELECT SourceCityID,DestCityID
    FROM Rout
    GROUP BY SourceCityID,DestCityID
    HAVING count(*) > 1)AS Duplicates
WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID)AS DuplicateDetail
然后更新表格tbl,如下所示:

UPDATE Form SET RoutID=DuplicateGroup.RoutID
FROM
    Form,
    (SELECT * FROM
        Rout,
        (SELECT MAX(RoutID) MinRoutID
        FROM Rout,
            (SELECT SourceCityID,DestCityID
            FROM Rout
            GROUP BY SourceCityID,DestCityID
            HAVING count(*) > 1) AS Duplicates
        WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID
        GROUP BY Rout.SourceCityID,Rout.DestCityID)AS MRCols
    WHERE RoutID=MinRoutID)AS DuplicateGroup
    ,
    (SELECT RoutID,Rout.SourceCityID,Rout.DestCityID FROM Rout,
        (SELECT SourceCityID,DestCityID
        FROM Rout
        GROUP BY SourceCityID,DestCityID
        HAVING count(*) > 1)AS Duplicates
    WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID)AS DuplicateDetail
WHERE
    Form.RoutID=DuplicateDetail.RoutID AND
    DuplicateGroup.SourceCityID=DuplicateDetail.SourceCityID
    AND DuplicateGroup.DestCityID=DuplicateDetail.DestCityID
现在删除Rout中不在表格式中的行

DELETE FROM Rout WHERE RoutID NOT IN(SELECT DISTINCT RoutID FROM Form)

我这样做是为了我的表Rout(RoutID、SourceCityID、DestCityID)和Form(FormID、RoutID,…) 我从Rout表中删除了重复的Rout,并在FormTable中更新了RoutID
首先,将重复的行按要比较的列分组,以进行重复

(SELECT * FROM
    Rout,
    (SELECT MIN(RoutID) MinRoutID
    FROM Rout,
        (SELECT SourceCityID,DestCityID
        FROM Rout
        GROUP BY SourceCityID,DestCityID
        HAVING count(*) > 1) AS Duplicates
    WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID
    GROUP BY Rout.SourceCityID,Rout.DestCityID)AS MRCols
WHERE RoutID=MinRoutID)AS DuplicateGroup
(SELECT RoutID,Rout.SourceCityID,Rout.DestCityID FROM Rout,
    (SELECT SourceCityID,DestCityID
    FROM Rout
    GROUP BY SourceCityID,DestCityID
    HAVING count(*) > 1)AS Duplicates
WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID)AS DuplicateDetail
然后获取所有重复的行,不进行分组,并使用将进行重复比较的列

(SELECT * FROM
    Rout,
    (SELECT MIN(RoutID) MinRoutID
    FROM Rout,
        (SELECT SourceCityID,DestCityID
        FROM Rout
        GROUP BY SourceCityID,DestCityID
        HAVING count(*) > 1) AS Duplicates
    WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID
    GROUP BY Rout.SourceCityID,Rout.DestCityID)AS MRCols
WHERE RoutID=MinRoutID)AS DuplicateGroup
(SELECT RoutID,Rout.SourceCityID,Rout.DestCityID FROM Rout,
    (SELECT SourceCityID,DestCityID
    FROM Rout
    GROUP BY SourceCityID,DestCityID
    HAVING count(*) > 1)AS Duplicates
WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID)AS DuplicateDetail
然后更新表格tbl,如下所示:

UPDATE Form SET RoutID=DuplicateGroup.RoutID
FROM
    Form,
    (SELECT * FROM
        Rout,
        (SELECT MAX(RoutID) MinRoutID
        FROM Rout,
            (SELECT SourceCityID,DestCityID
            FROM Rout
            GROUP BY SourceCityID,DestCityID
            HAVING count(*) > 1) AS Duplicates
        WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID
        GROUP BY Rout.SourceCityID,Rout.DestCityID)AS MRCols
    WHERE RoutID=MinRoutID)AS DuplicateGroup
    ,
    (SELECT RoutID,Rout.SourceCityID,Rout.DestCityID FROM Rout,
        (SELECT SourceCityID,DestCityID
        FROM Rout
        GROUP BY SourceCityID,DestCityID
        HAVING count(*) > 1)AS Duplicates
    WHERE Rout.SourceCityID=Duplicates.SourceCityID AND Rout.DestCityID=Duplicates.DestCityID)AS DuplicateDetail
WHERE
    Form.RoutID=DuplicateDetail.RoutID AND
    DuplicateGroup.SourceCityID=DuplicateDetail.SourceCityID
    AND DuplicateGroup.DestCityID=DuplicateDetail.DestCityID
现在删除Rout中不在表格式中的行

DELETE FROM Rout WHERE RoutID NOT IN(SELECT DISTINCT RoutID FROM Form)