обновление sql (помогите мне) - PullRequest
0 голосов
/ 31 января 2012

У меня есть 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, а) в таблице tbl_group, но оба эти grp_id (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, признак
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 y Здесь (в tbl_group) grp_id - это первичный ключ

нежелательные данные (показатели) в групповой таблице (222,22, 101, у) grp_nbr имеет одну длину символа, но grp_nbr в tbl_indicat имеет длину два символа ... как мы можем справиться с этим ??

1 Ответ

5 голосов
/ 31 января 2012

Сначала выясните, какие записи необходимо обновить:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...