Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.015 c
15-1255284553
Denis123
2009-10-11 22:09
2009.12.13
Проверка сложности пaроля


2-1256623184
Sw
2009-10-27 08:59
2009.12.13
Combobox и Escape


2-1256122896
stas
2009-10-21 15:01
2009.12.13
Использование LogonUser


2-1256211022
snowkam
2009-10-22 15:30
2009.12.13
rак поменять разделитель


2-1256041828
Aleks
2009-10-20 16:30
2009.12.13
TreeView MouseRightClick