Текущий архив: 2009.12.13;
Скачать: CL | DM;
ВнизКоррелированный подзапрос в UPDATE в MSSQL2000 Найти похожие ветки
← →
kaif © (2008-09-05 23:35) [0]Не имею Большого опыта в MSSQL
Пытаюсь сделать что-то вроде:
UPDATE <имя таблицы> T1
SET T1.<имя поля> =
(SELECT T2.<имя поля> FROM <та же таблица> T2
WHERE T2.<некое поле> = T1.<некое поле>)
Никогда не сталкивался с трудностями с подобными запросами в IB или ORACLE.
А MSSQL говорит "неверный синтаксис около T1". Такое ощущение, что MSSQL не позволяет использовать алиасы таблиц таким вот образом.
← →
Виталий Панасенко(дом) (2008-09-06 00:13) [1]попробуй ПОЛНОЕ имя таблицы..я на что-то в триггере "наступал"
← →
sniknik © (2008-09-06 00:42) [2]UPDATE <имя таблицы>
SET T1.<имя поля> = ....
FROM <имя таблицы> T1
....
> Никогда не сталкивался с трудностями с подобными запросами в IB или ORACLE.
это потому, что с ними сначала столкнулся... не знал синтаксиса, полез в справку... а сейчас считаешь знаешь, пытаешься по аналогии делать, в справку не заглядывая.
кстати, подобное, с подзапросом будет медлено работать, имхо (не охота проверять), лучше сделать на обьединении (join), должно быть гораздо быстрее.
← →
sniknik © (2008-09-06 00:46) [3]> на обьединении
UPDATE <имя таблицы>
SET T1.<имя поля> = T2.<имя поля>
FROM <имя таблицы> T1 INNER JOIN <та же таблица> T2 ON T2.<некое поле> = T1.<некое поле>
← →
kaif © (2008-09-06 01:41) [4]Я уже решил проблему несколько иначе.
Но это интересно. sniknik © (06.09.08 00:46) [3]
Я не знал, что UPDATE позволяет использовать FROM
Спасибо!
У меня нет нормального руководства по Transact-SQL, к сожалению. :(
← →
kaif © (2008-09-06 01:44) [5]Что касается скоростей, большинство серверов сами превращают вложенный подзапрос в обычное объединение (INNER или OUTER JOIN) автоматически, если это возможно по логике. Поэтому я не сильно забочусь об этом. Хотя может MSSQL этого не умеет. Не знаю.
← →
sniknik © (2008-09-06 11:03) [6]> У меня нет нормального руководства по Transact-SQL, к сожалению. :(
оно ставится вместе с mssql... отмазка не "катит"
> большинство серверов сами превращают
у них Хотабыч в оптимизаторах служит? :)
> Хотя может MSSQL этого не умеет.
может умеет, может нет. чтобы быть уверенным нужно проверить варианты, смотреть план их выполнения... причем каждого написанного запроса т.к. неясна грань изменений/сложности запроса после которой оптимизатор не справится.
вот есть у тебя примеру запрос, ты его просто скопировал для другой таблици (т.е. 2 идентичных), думаешь работают одинаково, а оптимизатор встретил единственное изменение, имя таблици, и посчитал его служебным/управляющим словом, или размер таблици посчитал недостаточным/индексы не те, не там/не нашел по чему связывать, и оставил все как есть...
проще, имхо, просто писать один раз, правильно, а не глупо.
← →
Anatoly Podgoretsky © (2008-09-06 11:42) [7]
> У меня нет нормального руководства по Transact-SQL, к сожалению.
> :(
А ты что в уме пишешь, без сервера?
Ну так BOL можно и скачать у микрософт, и на русском и на английском, при этом они склеиваются в одно руководство.
← →
kaif © (2008-09-06 16:04) [8]sniknik © (06.09.08 11:03) [6]
> У меня нет нормального руководства по Transact-SQL, к сожалению. :(
оно ставится вместе с mssql... отмазка не "катит"
А у меня не поставилась. :(
Или я не могу найти.
Я скачал и поставил SQLEXPRESS 2007
Может быть в эксперсс-версии документации просто нет? И ее надо скачать отдельно? Может кто-нибудь из добрых людей подкинет ссылку, откуда конкретно это можно скачать?
Что такое BOL ? Anatoly Podgoretsky © (06.09.08 11:42) [7]
У меня еще один вопрос.
Мне дали тестовое задание. Довольно хитро навороченный запрос. В котором нужно в частности выудить дату 10-го по порядку договора из таблицы договоров и ее использовать в условиях объединений. Так как MSSQL отказался принимать запрос агрегатной функцией MAX над подзапросом TOP 10 с упорядочиванием в подзапросе, мне пришлось использовать CTE (Common Table Expression), то есть оператор WITH в SELECTE, превратив набор TOP 10 как бы во временную таблицу с некоторым алиасом.
У меня это сразу заработало под SQLEXPRESS 2007.
Заработает ли это под SMSQL 2000 ?
← →
kaif © (2008-09-06 16:09) [9]Извиняюсь, у меня SQLEXPRESS 2005, я ошибся.
Подскажите, работает ли CTE (оператор WITH в SELECT-е) в MSSQL 2000?
← →
Anatoly Podgoretsky © (2008-09-06 17:14) [10]> kaif (06.09.2008 16:04:08) [8]
BOL = Book OnLine - это название документации.
Скачивается и устанавливается отдельно от студии.
Вот по данной фразе и ищи на Микрософте, и учти, что я ранее сказал про языки.
← →
stas © (2008-09-06 18:15) [11]kaif © (06.09.08 16:09) [9]
на 2000 не заработает, но ты можешь использовать временные таблицы либо подзапросы.
Напиши что тебе нужно конкретнее
> Так как MSSQL отказался принимать запрос агрегатной функцией
> MAX
Если он отказался значит запрос неправильный.
на SQL.RU есть русское руководство по MSSQL 2005, я недавно оставлял ссылку где можно скачать его.
← →
stas © (2008-09-06 18:17) [12]http://www.forum.script-coding.info/viewtopic.php?id=43
← →
kaif © (2008-09-06 21:48) [13]Спасибо!
← →
kaif © (2008-09-06 21:49) [14]Я переделал запрос так, чтобы не юзать CTE. На подзапросах удалось реализовать. Правда стало менее читабельно - факт.
← →
kaif © (2008-09-06 21:58) [15]Странно знаете, что?
Вот такой запрос не работает:select max(id) --последний из 10 первых
from
(select top 10 id
from dogovor
order by id)
Incorrect syntax near ")".
А вот такой работает:select max(Top10.id) --последний из 10 первых
from
(select top 10 id
from dogovor
order by id) Top10
То есть MSSQL любит, чтобы у подзапросов были алиасы.
Спасибо всем!!!
← →
sniknik © (2008-09-06 23:01) [16]> Правда стало менее читабельно - факт.
как пишешь так и стало...
запрос из [15] всего лишselect top 10 :id = id from dogovor order by id
тип параметра :id поставить output
← →
kaif © (2008-09-07 00:20) [17]2 sniknik © (06.09.08 23:01) [16]
У меня этот запрос является сам в свою очередь подзапросом в довольно громоздком запросе. С помощью параметра я смогу разве передать значение из подзапроса в запрос более высокого уровня?
← →
sniknik © (2008-09-07 01:06) [18]> У меня этот запрос является сам в свою очередь подзапросом в довольно громоздком запросе.
ну извини, телепетор сломался.
> С помощью параметра я смогу разве передать значение из подзапроса в запрос более высокого уровня?
вряд ли, но пример был не на использование параметра где бы ни было, а в ответ на "менее читабельно". стало по моему лучше... читабельнее.
громоздкие запросы тоже можно писать читабельно. а параметр возможно вообще там вообще не нужен, или подзапрос (телепатор починю скажу точнее). в первом запросе в нормальном варианте он ведь не понадобился, да и во втором тоже.
← →
Медвежонок Пятачок © (2008-09-07 22:16) [19]То есть MSSQL любит, чтобы у подзапросов были алиасы.
Спасибо всем!!!
там это называется табличным выражнием. Ему всегда имя нужно в отличие от оракла например
← →
имя (2009-01-08 22:28) [20]Удалено модератором
Страницы: 1 вся ветка
Текущий архив: 2009.12.13;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.241 c