Update...

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
Ashok
Сообщения: 2
Зарегистрирован: 21 май 2009, 12:22

21 май 2009, 12:39

Есть две таблицы:
1) dbo.tb_org
id_org s_FullName id_sps
1 АвтоОбуффь, торгово-сервисный центр NULL
2 Вершина, ИП Василенко Ю.Б. NULL
3 Гагарин-Шина, торгово-сервисный центр NULL
...n

2) dbo.tb_sps
id_sps s_Name Org
1 Фантазия ООО "Рога и Копыта"
2 Нет фантазии ЗАО "Хвосты и Копыта"
3 Почти дибил МУП "12"
...n

Необходимо обновить столбец id_sps таблицы dbo.tb_org согласно условию - если значение в столбце Org таблицы dbo.tb_sps равно значению столбца s_FullName таблицы dbo.tb_org возьми значение столбца id_sps таблицы dbo.tb_sps и произведи update столбца id_sps таблицы dbo.tb_org

Прошу помочь написать это на понятном сиквелю 2000 языке.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

21 май 2009, 13:06

Поможет коррелированный UPDATE. Т.е. выражение SET должно содержать коррелированный подзапрос

update dbo.tb_org as tb_org1
set is_sps = (select id_sps from dbo.tb_sps where Org=tb_org1.s_FullName);

При этом надо гарантировать уникальность значений в поле Org, иначе запрос прорвёт где-то на середине.
Если вдруг дубликаты есть, то их можно исключить используя агрегирование или директиву TOP N (Если я не ошибаюсь, у MSSQL она должна поддерживаться)

т.е. например:

update dbo.tb_org as tb_org1
set is_sps = (select min(id_sps) from dbo.tb_sps where Org=tb_org1.s_FullName);

или

update dbo.tb_org as tb_org1
set is_sps = (select top 1 id_sps from dbo.tb_sps where Org=tb_org1.s_FullName);
Ashok
Сообщения: 2
Зарегистрирован: 21 май 2009, 12:22

21 май 2009, 13:35

Спасибо большое! Буду пробовать.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Naeel Maqsudov писал(а):Поможет коррелированный UPDATE. Т.е. выражение SET должно содержать коррелированный подзапрос

update dbo.tb_org as tb_org1
set is_sps = (select id_sps from dbo.tb_sps where Org=tb_org1.s_FullName);

При этом надо гарантировать уникальность значений в поле Org, иначе запрос прорвёт где-то на середине.
Если вдруг дубликаты есть, то их можно исключить используя агрегирование или директиву TOP N (Если я не ошибаюсь, у MSSQL она должна поддерживаться)

т.е. например:

update dbo.tb_org as tb_org1
set is_sps = (select min(id_sps) from dbo.tb_sps where Org=tb_org1.s_FullName);

или

update dbo.tb_org as tb_org1
set is_sps = (select top 1 id_sps from dbo.tb_sps where Org=tb_org1.s_FullName);
Ошибку выдает:
Incorrect syntax near the keyword 'as'.
ustas
Сообщения: 4
Зарегистрирован: 24 июл 2009, 18:23

24 июл 2009, 19:05

Ashok писал(а):Спасибо большое! Буду пробовать.
Ошибку выдает:
Incorrect syntax near the keyword 'as'.
убери "as tb_org1" из скрипта и вместо "tb_org1" пиши явно "dbo.tb_org"
Ответить