2013-02-21 64 views
1

我有三个表: 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在SQL和修改关系表中删除重复相应

将会遇到2种将会遇到的重复项 1)项目重复在相同的menu_description 2)在不同的菜单描述中重复项目

示例:午餐菜单中的两个鸡肉三明治。在午餐和另外一个鸡肉三明治在晚宴菜单_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 ........................... .1
1 ............................ 2
1 ............. ............... 3
1 ............................ 4
2 ............................ 5用3替换
2 .............. .............. 6
3 ............................ 7
3 ............................ 8用1替换
3 ............ ................ 9

如何在删除重复项后使用替换的值更新我的menu_has_item?

回答

0

首先你需要后,你需要从项目表 删除重复,你可以发现剧本有 http://sprogram.com.ua/en/articles/oracle-delete-duplicate-record

UPS您标记问题,如PLSQL和新的价值

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; 

更换您的副本中menu_tab我错误地认为你关于甲骨文,对不起。 但我在MySQL supose存在MERGE语句 好运

1
begin 
    for x in (
      -- find duplicate items 
      select * 
       from (select rowid row_id, 
          item_id, 
          item_description, 
          row_number() over(partition by item_description order by 
          item_description) row_no 
         from item_tab) 
      where row_no > 1) loop 
-- replaceing duplicate Items 
    update menu_has_item 
    set menu_has_item.item_tab_item_id = 
      (select item_id 
       from (select item_id, 
          row_number() over(partition by item_description order by 
          item_description) row_no 
         from item_tab where 
         item_tab.item_description = x.item_description) 
      where row_no = 1) 
    where menu_has_item .item_tab_item_id = x.item_id; 
-- deleting duplicate items 
    delete item_tab where rowid = x.row_id; 
    end loop; 
-- commit; 
end; 
0

我这样做对我的表溃败(RoutID,SourceCityID,DestCityID)和表格(FormID,RoutID,...) 我删除了重复击溃表溃败和形式表更新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 

然后得到所有重复的行不进行分组,并与将COMPAR列编辑重复

(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 

,现在删除溃败以表格形式的arent行

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