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

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

Коррелированный подзапрос в UPDATE в MSSQL2000 [MSSQL]


kaif ©   (2008-09-05 23:35:00) 

Не имею Большого опыта в MSSQL
Пытаюсь сделать что-то вроде:

UPDATE <имя таблицы> T1
 SET T1.<имя поля> =
 (SELECT T2.<имя поля> FROM <та же таблица> T2
  WHERE T2.<некое поле> = T1.<некое поле>)

Никогда не сталкивался с трудностями с подобными запросами в IB или ORACLE.

А MSSQL говорит "неверный синтаксис около T1". Такое ощущение, что MSSQL не позволяет использовать алиасы таблиц таким вот образом.


  (2009-01-08 22:28:00) [1]

Удалено модератором


Медвежонок Пятачок   (2008-09-07 22:16:00) [2]

То есть MSSQL любит, чтобы у подзапросов были алиасы.

Спасибо всем!!!


там это называется табличным выражнием. Ему всегда имя нужно в отличие от оракла например


sniknik   (2008-09-07 01:06:00) [3]

> У меня этот запрос является сам в свою очередь подзапросом в довольно громоздком запросе.
ну извини, телепетор сломался.

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


kaif   (2008-09-07 00:20:00) [4]

2 sniknik ©   (06.09.08 23:01) [16]
У меня этот запрос является сам в свою очередь подзапросом в довольно громоздком запросе. С помощью параметра я смогу разве передать значение из подзапроса в запрос более высокого уровня?


sniknik   (2008-09-06 23:01:00) [5]

> Правда стало менее читабельно - факт.
как пишешь так и стало...

запрос из [15] всего лиш
select top 10 :id = id from dogovor order by id
тип параметра :id поставить output


kaif   (2008-09-06 21:58:00) [6]

Странно знаете, что?

Вот такой запрос не работает:

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 любит, чтобы у подзапросов были алиасы.

Спасибо всем!!!


kaif   (2008-09-06 21:49:00) [7]

Я переделал запрос так, чтобы не юзать CTE. На подзапросах удалось реализовать. Правда стало менее читабельно - факт.


kaif   (2008-09-06 21:48:00) [8]

Спасибо!


stas   (2008-09-06 18:17:00) [9]

http://www.forum.script-coding.info/viewtopic.php?id=43


stas   (2008-09-06 18:15:00) [10]

kaif ©   (06.09.08 16:09) [9]
на 2000 не заработает, но ты можешь использовать временные таблицы либо подзапросы.
Напиши что тебе нужно конкретнее

> Так как MSSQL отказался принимать запрос агрегатной функцией
> MAX

Если он отказался значит запрос неправильный.
на SQL.RU есть русское руководство по MSSQL 2005, я недавно оставлял ссылку где можно скачать его.


Anatoly Podgoretsky   (2008-09-06 17:14:00) [11]

> kaif  (06.09.2008 16:04:08)  [8]

BOL = Book OnLine - это название документации.
Скачивается и устанавливается отдельно от студии.
Вот по данной фразе и ищи на Микрософте, и учти, что я ранее сказал про языки.


kaif   (2008-09-06 16:09:00) [12]

Извиняюсь, у меня SQLEXPRESS 2005, я ошибся.
Подскажите, работает ли CTE (оператор WITH в SELECT-е) в MSSQL 2000?


kaif   (2008-09-06 16:04:00) [13]

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 ?


Anatoly Podgoretsky   (2008-09-06 11:42:00) [14]


> У меня нет нормального руководства по Transact-SQL, к сожалению.
>  :(

А ты что в уме пишешь, без сервера?
Ну так BOL можно и скачать у микрософт, и на русском и на английском, при этом они склеиваются в одно руководство.


sniknik   (2008-09-06 11:03:00) [15]

> У меня нет нормального руководства по Transact-SQL, к сожалению. :(
оно ставится вместе с mssql... отмазка не "катит"

> большинство серверов сами превращают
у них Хотабыч в оптимизаторах служит? :)

> Хотя может MSSQL этого не умеет.
может умеет, может нет. чтобы быть уверенным нужно проверить варианты, смотреть план их выполнения... причем каждого написанного запроса т.к. неясна грань изменений/сложности запроса после которой оптимизатор не справится.
вот есть у тебя примеру запрос, ты его просто скопировал для другой таблици (т.е. 2 идентичных), думаешь работают одинаково, а оптимизатор встретил единственное изменение, имя таблици, и посчитал его служебным/управляющим словом, или размер таблици посчитал недостаточным/индексы не те, не там/не нашел по чему связывать, и оставил все как есть...
проще, имхо, просто писать один раз, правильно, а не глупо.


kaif   (2008-09-06 01:44:00) [16]

Что касается скоростей, большинство серверов сами превращают вложенный подзапрос в обычное объединение (INNER или OUTER JOIN) автоматически, если это возможно по логике. Поэтому я не сильно забочусь об этом. Хотя может MSSQL этого не умеет. Не знаю.


kaif   (2008-09-06 01:41:00) [17]

Я уже решил проблему несколько иначе.
Но это интересно. sniknik ©   (06.09.08 00:46) [3]
Я не знал, что UPDATE позволяет использовать FROM
Спасибо!
У меня нет нормального руководства по Transact-SQL, к сожалению. :(


sniknik   (2008-09-06 00:46:00) [18]

> на обьединении
UPDATE <имя таблицы>
SET T1.<имя поля> = T2.<имя поля>
FROM <имя таблицы> T1 INNER JOIN <та же таблица> T2 ON T2.<некое поле> = T1.<некое поле>


sniknik   (2008-09-06 00:42:00) [19]

UPDATE <имя таблицы>
SET T1.<имя поля> = ....
FROM <имя таблицы> T1
....

> Никогда не сталкивался с трудностями с подобными запросами в IB или ORACLE.
это потому, что с ними сначала столкнулся... не знал синтаксиса, полез в справку... а сейчас считаешь знаешь, пытаешься по аналогии  делать, в справку не заглядывая.

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


Виталий Панасенко(дом)   (2008-09-06 00:13:00) [20]

попробуй ПОЛНОЕ имя таблицы..я на что-то в триггере "наступал"


Наверх

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