Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

Коррелированный подзапрос в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.01 c
15-1255365742
Игорь Шевченко
2009-10-12 20:42
2009.12.13
Ставлю Windows 95. Pan european edition. С дискет :)


2-1256647118
И. Павел
2009-10-27 15:38
2009.12.13
Определения щелчка на Серых полях в StringGrid


2-1255649628
mm0
2009-10-16 03:33
2009.12.13
Фокус на главную форму


15-1255613662
Аркадий_малый
2009-10-15 17:34
2009.12.13
Сайт


15-1252563789
Terminal Name
2009-09-10 10:23
2009.12.13
Определить имена "тонких клиентов"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский