Конференция "Базы" » Update одной таблицы по условию из другой таблицы [DB2]
 
  • Юрий Зотов © (18.05.09 15:25) [0]
    Люди, что-то не соображу как сделать следующее

    Есть таблица T1 с полями K11 (int), K12 (int), F1 (char) и таблица T2 с полями K21 (int), K22 (int), F2 (char). Поля K11 и K12 есть составной ключ некоего документа, такой же ключ составляют поля K21 и K22.

    Требуется проапдейтить поле F1 в записях таблицы T1, удовлетворяющих условию:

    T1.K11 = T2.K21
    and
    T1.K12 = T2.K22
    and
    T2.F2 = 'НЕЧТО'

    И в силу недостаточного знания SQL не могу сообразить, как этот update написать. Поможите кто добрый, плз.
  • Игорь Шевченко © (18.05.09 15:37) [1]
    update t1 a set ...
    where (a.k11, a.k12) in (select b.k21,b.k22 from t2 b where b.f2 = 'НЕЧТО')

    ?
  • Игорь Шевченко © (18.05.09 15:39) [2]
    или exists

    update t1 a set ...
    where exists (select null from t2 b where b.k21 = a.k11 and b.k22 = a.k12 and b.f2 = 'НЕЧТО')
  • Romkin © (18.05.09 15:42) [3]
    Чем апдейтить-то? :)
    create table T1 (K11 int not null, K12 int not null, F1 char(<...>), primary key (K11, K12));
    create table T2 (K21 int not null, K22 int not null, F2 char(<...>), primary key (K21, K22));


    Вообще решение зависит от того, насколько полно поддерживается стандарт SQL, чего я о DB2 не знаю :(
    1.
    update T1 set F1 = <...>
    where (K11, K12) in (select K21, K22 from T2 where F2= 'НЕЧТО');


    2.
    update T1 set F1 = <...>
    where exists (select * from T2 where T2.K21 = T1.K11 and T2.K22 = T1.K12 and T2.F2 = 'НЕЧТО');

  • Romkin © (18.05.09 15:43) [4]
    :D
  • Игорь Шевченко © (18.05.09 15:47) [5]
    Romkin ©   (18.05.09 15:42) [3]

    :D
  • Ega23 © (18.05.09 16:06) [6]

    > Требуется проапдейтить поле F1 в записях таблицы T1, удовлетворяющих
    > условию:


    А на что идёт Update F1? На значение T2.F2 (в данном случае - 'НЕЧТО')?
  • sniknik © (18.05.09 16:08) [7]
    а явных джойнов DB2 не поддерживает?

    UPDATE T1
    SET T1.F1 = T1.F1 + T2.F1
    FROM T1 INNER JOIN T2 ON (T1.K11 = T2.K21 and T1.K12 = T2.K22 and T2.F2 = 'НЕЧТО')



    имхо проще.
  • sniknik © (18.05.09 16:11) [8]
    > имхо проще.
    да и быстрее должно быть чем с перезапросом на каждую запись.
  • Ega23 © (18.05.09 16:14) [9]
    Короче, должно сработать как-то так

    Update T1 set
     T1.F1 = ...
    from T1 inner join T2 on (T1.K11=T2.K21 and T1.K12=T2.K22 and T2.F2='НЕЧТО')



    Только у меня сомнения насчёт того, что должно в  
    T1.F1 = ...

    стоять. Вроде, там и значение из T1 и из T2 должно быть.

    З.Ы. Кстати. Так и не смог придумать тестового примера, дабы данные расходились...  :)
  • Ega23 © (18.05.09 16:15) [10]

    > sniknik ©   (18.05.09 16:08) [7]


    :)
  • Anatoly Podgoretsky © (18.05.09 16:18) [11]
    Юрий Зотов ©   (18.05.09 15:25)  
    До Update желательно написать работающий SELECT и тогда будет видно что проапдейтится и правильно, затем заменишь SELECT на Update
  • sniknik © (18.05.09 16:18) [12]
    немного поправлюсь, а то запрос получился логически неверным. не стоит смешивать условия объединения с условиями  отбора (получается перекос уже в другую сторону...)

    UPDATE T1
    SET T1.F1 = T1.F1 + T2.F1
    FROM T1 INNER JOIN T2 ON (T1.K11 = T2.K21 and T1.K12 = T2.K22)
    WHERE T2.F2 = 'НЕЧТО'



    так лучше. (опять имхо)
  • Юрий Зотов © (18.05.09 17:15) [13]
    Люди, вы гиганты. Спасибо.
  • Игорь Шевченко © (18.05.09 18:43) [14]
    sniknik ©   (18.05.09 16:18) [12]

    Синтаксис UPDATE...FROM для меня несколько странен...
  • Ega23 © (18.05.09 20:04) [15]

    > Синтаксис UPDATE...FROM для меня несколько странен...


    Должен быть. В ANSI, вроде как, присутствует.
  • Игорь Шевченко © (18.05.09 20:41) [16]

    > Должен быть. В ANSI, вроде как, присутствует


    Вот хорошо тебе - ты SQL недавно изучаешь. А представь, что 20 с лишним лет ты видел один синтаксис, а потом всякие там ANSI придумывают нечто.

    Кроме того синтаксис
    UPDATE foo SET ...
    WHERE

    более очевиден, чем

    UPDATE foo SET ...
    FROM ...

    В первом случае ты понимаешь, что надо обновить по условию, во втором впадаешь в ступор.
  • Petr V. Abramov © (18.05.09 21:04) [17]

    > Игорь Шевченко ©   (18.05.09 20:41) [16]


    > а потом всякие там ANSI придумывают нечто.

    угу.
    вот их бы посадить запросы писать-читать, а не стандарты выдумывать.
    я серьезно.
    про метлы не утрирую. пока не утрирую.
  • sniknik © (18.05.09 21:59) [18]
    > А представь, что 20 с лишним лет ты видел один синтаксис, а потом всякие там ANSI придумывают нечто.
    ну я поменьше 20-ти, но тем не менее начинал в базах с foxpro, где селект был даже не запросом, а открытием рабочей области, и только после "трансформировался" в подобие запроса, на самом деле была та же рабочая область просто с условиями (можно было повторно открыть такой "запрос" указав вместо запроса индекс рабочей области). и ничего адаптировался. и считаю, что то, что есть теперь, удобнее.

    > более очевиден, чем
    серьезно? и как тогда в "твоем" запросе "по условию"
    > update t1 a set ...
    > where (a.k11, a.k12) in (select b.k21,b.k22 from t2 b where b.f2 = 'НЕЧТО')
    без объединения использовать в апдейте данные другой таблицы, как здесь
    > UPDATE T1
    > SET T1.F1 = T1.F1 + T2.F1
    > FROM T1 INNER JOIN T2 ON (T1.K11 = T2.K21 and T1.K12 = T2.K22)
    > WHERE T2.F2 = 'НЕЧТО'

    очевидно объединение нужно, ну сделаешь ты его неявным но по сути будет тоже самое.

    > вот их бы посадить запросы писать-читать, а не стандарты выдумывать.
    думаешь их придумывают совсем неграмотные?
  • Игорь Шевченко © (18.05.09 22:33) [19]

    > но тем не менее начинал в базах с foxpro


    Во-во.

    Я нисколько ни умаляю твои знания, но тем не менее, если долго работать с ненастольными базами, да еще если они поддерживают SQL, да еще если поддерживают так, как Oracle, это, знаешь ли, накладывает свои отпечатки на точку зрения.

    Я повторюсь - лично для меня UPDATE ... FROM выглядит необычно. Точно также я буду спотыкаться на UPDATE ... WHERE CURRENT OF, хотя этому синтаксису поболе лет, чем UPDATE FROM, но все равно он идет от магнитных лент и настольных баз.
 
Конференция "Базы" » Update одной таблицы по условию из другой таблицы [DB2]
Есть новые Нет новых   [134473   +31][b:0][p:0.002]