-
Не имею Большого опыта в MSSQL Пытаюсь сделать что-то вроде:
UPDATE <имя таблицы> T1 SET T1.<имя поля> = (SELECT T2.<имя поля> FROM <та же таблица> T2 WHERE T2.<некое поле> = T1.<некое поле>)
Никогда не сталкивался с трудностями с подобными запросами в IB или ORACLE.
А MSSQL говорит "неверный синтаксис около T1". Такое ощущение, что MSSQL не позволяет использовать алиасы таблиц таким вот образом.
-
попробуй ПОЛНОЕ имя таблицы..я на что-то в триггере "наступал"
-
UPDATE <имя таблицы> SET T1.<имя поля> = .... FROM <имя таблицы> T1 ....
> Никогда не сталкивался с трудностями с подобными запросами в IB или ORACLE. это потому, что с ними сначала столкнулся... не знал синтаксиса, полез в справку... а сейчас считаешь знаешь, пытаешься по аналогии делать, в справку не заглядывая.
кстати, подобное, с подзапросом будет медлено работать, имхо (не охота проверять), лучше сделать на обьединении (join), должно быть гораздо быстрее.
-
> на обьединении UPDATE <имя таблицы> SET T1.<имя поля> = T2.<имя поля> FROM <имя таблицы> T1 INNER JOIN <та же таблица> T2 ON T2.<некое поле> = T1.<некое поле>
-
Я уже решил проблему несколько иначе. Но это интересно. sniknik © (06.09.08 00:46) [3] Я не знал, что UPDATE позволяет использовать FROM Спасибо! У меня нет нормального руководства по Transact-SQL, к сожалению. :(
-
Что касается скоростей, большинство серверов сами превращают вложенный подзапрос в обычное объединение (INNER или OUTER JOIN) автоматически, если это возможно по логике. Поэтому я не сильно забочусь об этом. Хотя может MSSQL этого не умеет. Не знаю.
-
> У меня нет нормального руководства по Transact-SQL, к сожалению. :( оно ставится вместе с mssql... отмазка не "катит"
> большинство серверов сами превращают у них Хотабыч в оптимизаторах служит? :)
> Хотя может MSSQL этого не умеет. может умеет, может нет. чтобы быть уверенным нужно проверить варианты, смотреть план их выполнения... причем каждого написанного запроса т.к. неясна грань изменений/сложности запроса после которой оптимизатор не справится. вот есть у тебя примеру запрос, ты его просто скопировал для другой таблици (т.е. 2 идентичных), думаешь работают одинаково, а оптимизатор встретил единственное изменение, имя таблици, и посчитал его служебным/управляющим словом, или размер таблици посчитал недостаточным/индексы не те, не там/не нашел по чему связывать, и оставил все как есть... проще, имхо, просто писать один раз, правильно, а не глупо.
-
> У меня нет нормального руководства по Transact-SQL, к сожалению. > :(
А ты что в уме пишешь, без сервера? Ну так BOL можно и скачать у микрософт, и на русском и на английском, при этом они склеиваются в одно руководство.
-
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 ?
-
Извиняюсь, у меня SQLEXPRESS 2005, я ошибся. Подскажите, работает ли CTE (оператор WITH в SELECT-е) в MSSQL 2000?
-
> kaif (06.09.2008 16:04:08) [8]
BOL = Book OnLine - это название документации. Скачивается и устанавливается отдельно от студии. Вот по данной фразе и ищи на Микрософте, и учти, что я ранее сказал про языки.
-
kaif © (06.09.08 16:09) [9] на 2000 не заработает, но ты можешь использовать временные таблицы либо подзапросы. Напиши что тебе нужно конкретнее
> Так как MSSQL отказался принимать запрос агрегатной функцией > MAX
Если он отказался значит запрос неправильный. на SQL.RU есть русское руководство по MSSQL 2005, я недавно оставлял ссылку где можно скачать его.
-
-
Спасибо!
-
Я переделал запрос так, чтобы не юзать CTE. На подзапросах удалось реализовать. Правда стало менее читабельно - факт.
-
Странно знаете, что? Вот такой запрос не работает: 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 любит, чтобы у подзапросов были алиасы. Спасибо всем!!!
-
> Правда стало менее читабельно - факт. как пишешь так и стало... запрос из [15] всего лиш select top 10 :id = id from dogovor order by id тип параметра :id поставить output
-
2 sniknik © (06.09.08 23:01) [16] У меня этот запрос является сам в свою очередь подзапросом в довольно громоздком запросе. С помощью параметра я смогу разве передать значение из подзапроса в запрос более высокого уровня?
-
> У меня этот запрос является сам в свою очередь подзапросом в довольно громоздком запросе. ну извини, телепетор сломался.
> С помощью параметра я смогу разве передать значение из подзапроса в запрос более высокого уровня? вряд ли, но пример был не на использование параметра где бы ни было, а в ответ на "менее читабельно". стало по моему лучше... читабельнее. громоздкие запросы тоже можно писать читабельно. а параметр возможно вообще там вообще не нужен, или подзапрос (телепатор починю скажу точнее). в первом запросе в нормальном варианте он ведь не понадобился, да и во втором тоже.
-
То есть MSSQL любит, чтобы у подзапросов были алиасы.
Спасибо всем!!!
там это называется табличным выражнием. Ему всегда имя нужно в отличие от оракла например
-
Удалено модератором
|