2012-01-31 47 views
-2

我有3個表:SQL更新(幫我)

 
tbl_indicator 

grp_nbr, sect_nbr, indicat 
1    100   p 
2    101   s
 
tbl_group 

grp_id, grp_nbr, sect_nbr,  indicat 
333   1    100   a 
555   1    100   p 
444   2    101   s 
222   2    101   y

這裏(tbl_group)grp_id是主鍵

 
tbl_order 

order_id,  grp_id 
5000    333 
5001    555 
5002    555 
5003    555 
5004    444 
5005    444 
5006    222

這裏(tbl_ordergrp_id是外鍵到grp_idtbl_group

在表tbl_indiactor中,對於一組grp_nbr和sect_nbr,有一個指示,對於同一組grp_nbr和sect_nbr,存在正確的指示(555,1,100,p)和垃圾指示(333,1 ,100,a)在表tbl_group中,但這兩個grp_id(333,555)出現在表tbl_orders中。

現在我需要以這樣的方式來更新tbl_order表垃圾grp_id S的關係有正確的grp_id s內更換

輸出應該想:

 
tbl_orders 

order_id,  grp_id 
5000    555 
5001    555 
5002    555 
5003    555 
5004    444 
5005    444 
5006    444

這裏是一個小的變化

tbl_indicator

grp_nbr,sect_nbr,indicat
01 100p中
02 101號第 tbl_group

grp_id,grp_nbr,sect_nbr,indicat
333 01 100一個
555 01 100p中
444 02 101號第 222 2 101Ý 這裏(在tbl_group)grp_id是主鍵

組表(222,22,101,y)中的垃圾數據(指示)grp_nbr有一個字符長度,但tbl_indicat中的grp_nbr有兩個字符長度... 我們該如何處理?

+2

您是否嘗試過其他任何方式,而不是查看常見問題解答或格式指南? – JNK 2012-01-31 17:05:51

+0

我做錯了什麼?對不起.... – 2012-01-31 17:14:05

+1

「有一個正確的指示(333,1,100,p)和一個垃圾指示(555,1,100,a)」 - 如果555是垃圾組,那麼爲什麼你想要輸出替換333與555?您所需的輸出也會用444替換222。看起來您認爲222和333是舊記錄或「垃圾」,因爲它們的指示字段與其相關的tbl_indicator記錄的指示字段不匹配。正確? – 2012-01-31 17:14:16

回答

5

首先,找出哪些記錄需要更新:

select * 
from tbl_order o 
inner join tbl_group g on 
    g.grp_id = o.grp_id 
inner join tbl_indicator i on 
    i.grp_nbr = g.grp_nbr 
    and i.sect_nbr = g.sect_nbr 
where 
    g.indicat != i.indicat 

現在,修改查詢,更新與正確grp_id的記錄。請注意,我已經爲tbl_group表添加了一個額外連接,其別名爲「g2」。這將是正確的組。

update o set 
    o.grp_id = g2.grp_id 
from tbl_order o 
inner join tbl_group g on 
    g.grp_id = o.grp_id 
inner join tbl_indicator i on 
    i.grp_nbr = g.grp_nbr 
    and i.sect_nbr = g.sect_nbr 
inner join tbl_group g2 on 
    g2.grp_nbr = i.grp_nbr 
    and g2.sect_nbr = i.sect_nbr 
    and g2.indicat = i.indicat 
where 
    g.indicat != i.indicat 

注意的是,由於內部聯接上tbl_group G2,該記錄將不,如果不存在,其中indicat其相關tbl_indicator記錄的indicat值匹配任何tbl_group記錄更新。

+0

工作就像一個魅力..... thnx噸...嘗試從2天,但力德找到任何運氣... thnx很多.. – 2012-01-31 17:37:56