sql update(帮帮我)

时间:2012-01-31 17:04:26

标签: sql sql-server sql-server-2005 tsql

我有3张桌子:

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_idgrp_idtbl_group的外键。

在表tbl_indiactor中,对于一组grp_nbr和sect_nbr,有一个指示,对于同一组grp_nbr和sect_nbr,有一个正确的指示(555,1,100,p)和一个垃圾指示(333,1, 100,a)在表tbl_group中,但这些grp_id s(333,555)都存在于表tbl_orders中。

现在我需要更新tbl_order表,以便用正确的grp_id替换垃圾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 100 p
02 101 s tbl_group

grp_id,grp_nbr,sect_nbr,indicat
333 01 100 a
555 01 100 p
444 02 101 222 2 101 y 这里(在tbl_group中)grp_id是主键

组表(222,22,101,y)中的垃圾数据(指示)grp_nbr有一个字符长度,但tbl_indicat中的grp_nbr有两个字符长度... 我们怎么办呢?

1 个答案:

答案 0 :(得分: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上的内部联接,如果不存在任何tbl_group记录,其中indicat与其关联的tbl_indicator记录的指示值匹配,则不会更新记录。