1

3つのテーブルがあります:menu_tabには列があります(menu_id、menu_description)item_tabには列があります(item_id、item_name、item_description、item_price)menu_has_itemには列があります{(menu_tab_menu_id ---> menu_idへの外部キー(menu_tabのpk))、item_tab_item_id- --これはitem_idへの外部キーです(item_tabのpk))4

発生する重複は2種類あります1)同じmenu_descriptionでのアイテムの重複2)異なるメニューの説明でのアイテムの重複

例:ランチメニューの2つのチキンサンドイッチ。ランチに1つのチキンサンドイッチ、ディナーにもう1つのチキンサンドイッチ_description

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 item_tab_item_id
1 ............................ 11
.................。 ........... 2
1 ............................ 31
.....。 ..................... 42
..........................。 .53に置き換えます
2............................
63.............。 .............. 7
3 ............................ 813に置き換え
ます。 ........................... 9

重複を削除した後、置換された値でmenu_has_itemを更新するにはどうすればよいですか?

4

3 に答える 3

0

まず、menu_tab の重複を新しい値に置き換える必要があります

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;

その後、項目テーブルから重複を削除する必要があります。そこにスクリプトがあります http://sprogram.com.ua/en/articles/oracle-delete-duplicate-record

あなたは質問をplsqlとマークしましたが、私はあなたがOracleについて間違っていると思います。申し訳ありません。しかし、MySQLにはマージステートメントが存在すると思います

于 2013-02-21T18:24:29.697 に答える
0

テーブルRout(RoutID、SourceCityID、DestCityID)およびForm(FormID、RoutID、...)に対してこれを行いましたテーブルRoutから重複したルートを削除し、フォームテーブルの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

次に、以下のようにフォーム 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)
于 2014-09-17T22:54:14.037 に答える