Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Update одной таблицы по условию из другой таблицы [DB2]


Страницы:   1 2 3 4

Юрий Зотов ©   (2009-05-18 15:25:00) 

Люди, что-то не соображу как сделать следующее

Есть таблица 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 написать. Поможите кто добрый, плз.


Игорь Шевченко   (2009-05-18 22:33:00) [61]


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


Во-во.

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

Я повторюсь - лично для меня UPDATE ... FROM выглядит необычно. Точно также я буду спотыкаться на UPDATE ... WHERE CURRENT OF, хотя этому синтаксису поболе лет, чем UPDATE FROM, но все равно он идет от магнитных лент и настольных баз.


sniknik   (2009-05-18 21:59:00) [62]

> А представь, что 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 = 'НЕЧТО'

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

> вот их бы посадить запросы писать-читать, а не стандарты выдумывать.
думаешь их придумывают совсем неграмотные?


Petr V. Abramov   (2009-05-18 21:04:00) [63]


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


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

угу.
вот их бы посадить запросы писать-читать, а не стандарты выдумывать.
я серьезно.
про метлы не утрирую. пока не утрирую.


Игорь Шевченко   (2009-05-18 20:41:00) [64]


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


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

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

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

UPDATE foo SET ...
FROM ...

В первом случае ты понимаешь, что надо обновить по условию, во втором впадаешь в ступор.


Ega23   (2009-05-18 20:04:00) [65]


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


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


Игорь Шевченко   (2009-05-18 18:43:00) [66]

sniknik ©   (18.05.09 16:18) [12]

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


Юрий Зотов   (2009-05-18 17:15:00) [67]

Люди, вы гиганты. Спасибо.


Anatoly Podgoretsky   (2009-05-18 16:18:00) [68]

Юрий Зотов ©   (18.05.09 15:25)  
До Update желательно написать работающий SELECT и тогда будет видно что проапдейтится и правильно, затем заменишь SELECT на Update


sniknik   (2009-05-18 16:18:00) [69]

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

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 = 'НЕЧТО'


так лучше. (опять имхо)


Ega23   (2009-05-18 16:15:00) [70]


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


:)


Ega23   (2009-05-18 16:14:00) [71]

Короче, должно сработать как-то так

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 должно быть.

З.Ы. Кстати. Так и не смог придумать тестового примера, дабы данные расходились...  :)


sniknik   (2009-05-18 16:11:00) [72]

> имхо проще.
да и быстрее должно быть чем с перезапросом на каждую запись.


sniknik   (2009-05-18 16:08:00) [73]

а явных джойнов 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 = 'НЕЧТО')


имхо проще.


Ega23   (2009-05-18 16:06:00) [74]


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


А на что идёт Update F1? На значение T2.F2 (в данном случае - 'НЕЧТО')?


Игорь Шевченко   (2009-05-18 15:47:00) [75]

Romkin ©   (18.05.09 15:42) [3]

:D


Romkin   (2009-05-18 15:43:00) [76]

:D


Romkin   (2009-05-18 15:42:00) [77]

Чем апдейтить-то? :)
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 = 'НЕЧТО');


Игорь Шевченко   (2009-05-18 15:39:00) [78]

или 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 = 'НЕЧТО')


Игорь Шевченко   (2009-05-18 15:37:00) [79]

update t1 a set ...
where (a.k11, a.k12) in (select b.k21,b.k22 from t2 b where b.f2 = 'НЕЧТО')

?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо