Конференция "Базы" » Коррелированный подзапрос в UPDATE в MSSQL2000 [MSSQL]
 
  • kaif © (05.09.08 23:35) [0]
    Не имею Большого опыта в MSSQL
    Пытаюсь сделать что-то вроде:

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

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

    А MSSQL говорит "неверный синтаксис около T1". Такое ощущение, что MSSQL не позволяет использовать алиасы таблиц таким вот образом.
  • попробуй ПОЛНОЕ имя таблицы..я на что-то в триггере "наступал"
  • sniknik © (06.09.08 00:42) [2]
    UPDATE <имя таблицы>
    SET T1.<имя поля> = ....
    FROM <имя таблицы> T1
    ....

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

    кстати, подобное, с подзапросом будет медлено работать, имхо (не охота проверять), лучше сделать на обьединении (join), должно быть гораздо быстрее.
  • sniknik © (06.09.08 00:46) [3]
    > на обьединении
    UPDATE <имя таблицы>
    SET T1.<имя поля> = T2.<имя поля>
    FROM <имя таблицы> T1 INNER JOIN <та же таблица> T2 ON T2.<некое поле> = T1.<некое поле>
  • kaif © (06.09.08 01:41) [4]
    Я уже решил проблему несколько иначе.
    Но это интересно. sniknik ©   (06.09.08 00:46) [3]
    Я не знал, что UPDATE позволяет использовать FROM
    Спасибо!
    У меня нет нормального руководства по Transact-SQL, к сожалению. :(
  • kaif © (06.09.08 01:44) [5]
    Что касается скоростей, большинство серверов сами превращают вложенный подзапрос в обычное объединение (INNER или OUTER JOIN) автоматически, если это возможно по логике. Поэтому я не сильно забочусь об этом. Хотя может MSSQL этого не умеет. Не знаю.
  • sniknik © (06.09.08 11:03) [6]
    > У меня нет нормального руководства по Transact-SQL, к сожалению. :(
    оно ставится вместе с mssql... отмазка не "катит"

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

    > Хотя может MSSQL этого не умеет.
    может умеет, может нет. чтобы быть уверенным нужно проверить варианты, смотреть план их выполнения... причем каждого написанного запроса т.к. неясна грань изменений/сложности запроса после которой оптимизатор не справится.
    вот есть у тебя примеру запрос, ты его просто скопировал для другой таблици (т.е. 2 идентичных), думаешь работают одинаково, а оптимизатор встретил единственное изменение, имя таблици, и посчитал его служебным/управляющим словом, или размер таблици посчитал недостаточным/индексы не те, не там/не нашел по чему связывать, и оставил все как есть...
    проще, имхо, просто писать один раз, правильно, а не глупо.
  • Anatoly Podgoretsky © (06.09.08 11:42) [7]

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

    А ты что в уме пишешь, без сервера?
    Ну так BOL можно и скачать у микрософт, и на русском и на английском, при этом они склеиваются в одно руководство.
  • kaif © (06.09.08 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 © (06.09.08 16:09) [9]
    Извиняюсь, у меня SQLEXPRESS 2005, я ошибся.
    Подскажите, работает ли CTE (оператор WITH в SELECT-е) в MSSQL 2000?
  • Anatoly Podgoretsky © (06.09.08 17:14) [10]
    > kaif  (06.09.2008 16:04:08)  [8]

    BOL = Book OnLine - это название документации.
    Скачивается и устанавливается отдельно от студии.
    Вот по данной фразе и ищи на Микрософте, и учти, что я ранее сказал про языки.
  • stas © (06.09.08 18:15) [11]
    kaif ©   (06.09.08 16:09) [9]
    на 2000 не заработает, но ты можешь использовать временные таблицы либо подзапросы.
    Напиши что тебе нужно конкретнее

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

    Если он отказался значит запрос неправильный.
    на SQL.RU есть русское руководство по MSSQL 2005, я недавно оставлял ссылку где можно скачать его.
  • stas © (06.09.08 18:17) [12]
  • kaif © (06.09.08 21:48) [13]
    Спасибо!
  • kaif © (06.09.08 21:49) [14]
    Я переделал запрос так, чтобы не юзать CTE. На подзапросах удалось реализовать. Правда стало менее читабельно - факт.
  • kaif © (06.09.08 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 © (06.09.08 23:01) [16]
    > Правда стало менее читабельно - факт.
    как пишешь так и стало...

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


    тип параметра :id поставить output
  • kaif © (07.09.08 00:20) [17]
    2 sniknik ©   (06.09.08 23:01) [16]
    У меня этот запрос является сам в свою очередь подзапросом в довольно громоздком запросе. С помощью параметра я смогу разве передать значение из подзапроса в запрос более высокого уровня?
  • sniknik © (07.09.08 01:06) [18]
    > У меня этот запрос является сам в свою очередь подзапросом в довольно громоздком запросе.
    ну извини, телепетор сломался.

    > С помощью параметра я смогу разве передать значение из подзапроса в запрос более высокого уровня?
    вряд ли, но пример был не на использование параметра где бы ни было, а в ответ на "менее читабельно". стало по моему лучше... читабельнее.
    громоздкие запросы тоже можно писать читабельно. а параметр возможно вообще там вообще не нужен, или подзапрос (телепатор починю скажу точнее). в первом запросе в нормальном варианте он ведь не понадобился, да и во втором тоже.
  • Медвежонок Пятачок © (07.09.08 22:16) [19]
    То есть MSSQL любит, чтобы у подзапросов были алиасы.

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


    там это называется табличным выражнием. Ему всегда имя нужно в отличие от оракла например
  • имя (08.01.09 22:28) [20]
    Удалено модератором
 
Конференция "Базы" » Коррелированный подзапрос в UPDATE в MSSQL2000 [MSSQL]
Есть новые Нет новых   [134477   +39][b:0][p:0.001]