我有3个表:
tbl_indicatorgrp_nbr,sect_nbr,指示1100便士2 101 s
tbl_groupgrp_id、grp_nbr、sect_nbr、indicator333 1100 a555 1 100便士4442101秒222 2 101年
这里(在tbl_group
中)grp_id是主键
tbl_orderorder_id,grp_id5000 3335001 5555002 5555003 5555004445005 4445006 222
这里(在tbl_order
中)grp_id
是tbl_group
中的grp_id
的外键。
在表tbl_indiactor中,对于一组grp_nbr和sect_nbr,存在一个指示符,对于同一组grp.nbr和sect_nbr,在表tbl_group中存在一个正确的指示符(555,1100,p)和一个垃圾指示符(333,1100,a),但这两个grp_id(333,555)都存在于表tbl_orders中。
现在我需要更新tbl_order表,以便用正确的grp_ids 替换垃圾grp_ids
输出应该是:
待定订单order_id,grp_id5000 5555001 5555002 5555003 5555004445005 4445006 444
这是一个零钱
tbl_indicator
grp_nbr,sect_nbr,表示
01 100 p
02 101秒tbl_group
grp_id,grp_nbr,sect_nbr,指示
333 01 100 a
555 01 100 p
444 02 101秒222 2 101年这里(在tbl_group中)grp_id是主键
分组表(22222101,y)中的垃圾数据(indicatr)grp-nbr有一个字符长度,而tbl_indicatr中的grp-nbr则有两个字符长度。。。我们该如何处理??
首先,找出哪些记录需要更新:
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_indicator记录的指示符值匹配的任何tbl_group记录,则不会更新记录。