powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хотите постучаться лбом об дерево?
18 сообщений из 18, страница 1 из 1
Хотите постучаться лбом об дерево?
    #32005597
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Есть таблица, в которой находятся записи, образующие дерево.
Create table Tree(ID int primary key, ParentID int Null, Value int Null)
Глубина дерева не превышает ограничений по вложенности рекурсивных триггеров. Задача: присвоить Value всех дочерних записей значение Value родителских записей. Понятно, что на рекурсивных триггерах такая задача решается красиво. На самом деле задача несколько сложнее, но, решая ее, натолкнулся на интересное ограничение T-SQL.

update Tree set Value=P.Value
from Tree P, Tree C where P.ID=C.ParentID

Запрос подгобного вида выдает ошибку: "The table 'Tree' is ambiguous.", хотя таблица Tree существует и при запросе Select с той же самой конструкцией FROM все нормально работает.
Выкрутиться-то я выкручусь, но сам факт мне представляется интересным.

И еще одно интересное замечание о временных таблицах в рекурсивном триггере. Подозреваю, что Create #SomeTable на втором уровне рекурсии может конфликтнуть с уже созданой этой же таблицей на первом уровне вложенности рекурсивного триггера (конкретно эксперимент провести пока не успел). Можно, конечно, проверять TRIGGER_NESTLEVEL() для обхода повторного создания той же таблицы. Что думаете по этому поводу?
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005599
Akexander Chepack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
update С set С.Value=P.Value
from Tree P, Tree C where P.ID=C.ParentID

И наслаждайтесь жизнью - заодно синтакс T-SQL подучите
Concerning ambiguous table: с точки зрения здравого смысла - у Вас же две таблицы Tree в запросе - Вы какую обновлять собирались? А с точки зрения синтаксиса у вас есть таблица C и таблица P - и все.
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005605
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Akexander Chepack
У вас случайно не 6-я версия стоит?
Дело в том что такие конструкции:
update С set С.Value=P.Value
from Tree P, Tree C where P.ID=C.ParentID
допускались до 6-й версии. В 6.5 уже нет. Вроде как обновление таблицы данными из этой же таблицы - это запрещается каким-то ANSI-стандартом.


Насчет временных таблиц в триггерах - а если их заменить переменными-таблицами?
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005608
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergSuper

Не знаю насчет стандарта, только у меня обновление таблицы данными из этой же таблицы успешно прошло по запросу аналогичному Akexander Chepack. MS SQL 7.
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005615
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Akexander Chepack

Не верю. Во всяком случае у меня если написать:
create table #t(i int)
go
update #t
set a.i=b.i
from #t a, #t b

выдаст:
Server: Msg 1032, Level 15, State 1, Line 4
Cannot use the column prefix 'a'. This must match the object in the UPDATE clause '#t'.

Стоит 2000-й, но такое происходит с 6.5
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005619
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergSuper

Вы невнимательно посмотрели на запрос, нужно так:
update а
set a.i=b.i
from #t a, #t b
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005621
REX_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверено.
Запрос update C set C.value=P.value from tree P, tree C where C.ParentID=P.ID - работает на 2000-ке, равно как и на 7-ке
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005623
Alexander Chepack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том что такие конструкции:

update С
set С.Value=P.Value
from Tree P, Tree C
where P.ID=C.ParentID
допускались до 6-й версии. В 6.5 уже нет.
--------------------------------------------

А по-моему, как раз наоборот - начиная с 6.5 надо пользоваться приведенным мной синтаксисом - поверьте, работает - более того об изменениях в синтаксисе, опять же по-моему, говорится в списке "Чего нового?" в BOL по 6.5 - проходил я все это когда перетаскивал базу с шестерочным синтаксисом на 6.5. Ну и в Вашем случае я бы JOIN
использовал - хотя это не критично.
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005624
Alexander Chepack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, о деревьях - есть такая книжка SQL for Smarties - очень рекомендую - так куча всяких занятных задачек приведена на SQL'е.
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005626
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexander Chepack

Плиз, поподробнее про книжечку, ну там автор и все такое
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005627
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, пардон, был не прав.
Чего только не узнаешь.

С трудом нашел об этом упоминание в BOL - есть только по теме UPDATE, compatibility issues
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005631
REX_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вообще да, MS потихоньку уходит от старого-доброго where и говорит, что в последующем будет придерживаться исключительно стандарта ANSI.

update C set C.Value=P.Value from tree C inner join tree P on C.ParentID=P.ID - более 'красивей' смотрится

2 Alexander Chepack:
а про книжечку на самом деле хотелось бы узнать, ЧТО? ГДЕ? ПО_ЧЕМ?
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005642
REX_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander, про книжечку можно и на мыло написАть: alhen@ukr.net
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005644
Alexander Chepack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ссылка на амазоне:

http://www.amazon.com/exec/obidos/ASIN/1558605762/o/qid=989853012/sr=8-1/ref=aps_sr_b_1_1/107-4627833-7726103

Название: Joe Celko's SQL for Smarties: Advanced SQL Programming
ISBN: 1558605762
Автор: Joe Celko - мужик довольно известный - ведет (или вел?) колонку в DB Magazine.
У него еще куча книг есть - я свою, кстати, с этими переездами из страны в страну потерял - да у меня старое издание было, придется снова покупать.
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005664
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 REX_X
>А вообще да, MS потихоньку уходит от старого-доброго where и говорит, что в последующем будет придерживаться исключительно стандарта ANSI.

Я тут в какой то ветке уже разбирался с этим вопросом, вот цитатка из BOL

Outer join conditions, however, may interact differently with the WHERE clause search conditions, depending on whether the join conditions are in the FROM or WHERE clause. Therefore, the ability to specify Transact-SQL outer joins in the WHERE clause is not recommended, is no longer documented, and will be dropped in a future release.

2 Alexander Chepack

пасиба
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005669
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Genady
В приведенной цитате имеются ввиду outer joins in the WHERE которые выглядят как where field1*=field2
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005671
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergSuper

Да речь идет об outer join-ах, потому что в зависимости от того где его задать во from или в where будет возвращаться разный набор строк, где указаывать inner join не имеет значения, результат будет один и тот же.
...
Рейтинг: 0 / 0
Хотите постучаться лбом об дерево?
    #32005672
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т. е. я хотел сказать, что результат будет отличаться если в выражении where заданы еще и условия, накладывающие фильтр, в BOL это подробно описано с примерами.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хотите постучаться лбом об дерево?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]