sql更新(帮助我)



我有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_idtbl_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记录,则不会更新记录。

最新更新