PDA

Просмотр полной версии : Update...



Ashok
21.05.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
21.05.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
21.05.2009, 13:35
Спасибо большое! Буду пробовать.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------

Поможет коррелированный 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
24.07.2009, 19:05
Спасибо большое! Буду пробовать.
Ошибку выдает:
Incorrect syntax near the keyword 'as'.

убери "as tb_org1" из скрипта и вместо "tb_org1" пиши явно "dbo.tb_org"