我有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_order
)grp_id
是grp_id
中tbl_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有两个字符长度... 我们怎么办呢?
答案 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记录的指示值匹配,则不会更新记录。