Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хотите постучаться лбом об дерево? / 18 сообщений из 18, страница 1 из 1
14.05.2001, 15:16
    #32005597
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
14.05.2001, 15:45
    #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
14.05.2001, 16:00
    #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
14.05.2001, 16:15
    #32005608
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хотите постучаться лбом об дерево?
2 SergSuper

Не знаю насчет стандарта, только у меня обновление таблицы данными из этой же таблицы успешно прошло по запросу аналогичному Akexander Chepack. MS SQL 7.
...
Рейтинг: 0 / 0
14.05.2001, 16:50
    #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
14.05.2001, 17:03
    #32005619
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хотите постучаться лбом об дерево?
2 SergSuper

Вы невнимательно посмотрели на запрос, нужно так:
update а
set a.i=b.i
from #t a, #t b
...
Рейтинг: 0 / 0
14.05.2001, 17:13
    #32005621
REX_X
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хотите постучаться лбом об дерево?
Проверено.
Запрос update C set C.value=P.value from tree P, tree C where C.ParentID=P.ID - работает на 2000-ке, равно как и на 7-ке
...
Рейтинг: 0 / 0
14.05.2001, 17:31
    #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
14.05.2001, 17:34
    #32005624
Alexander Chepack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хотите постучаться лбом об дерево?
Кстати, о деревьях - есть такая книжка SQL for Smarties - очень рекомендую - так куча всяких занятных задачек приведена на SQL'е.
...
Рейтинг: 0 / 0
14.05.2001, 17:37
    #32005626
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хотите постучаться лбом об дерево?
2 Alexander Chepack

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

С трудом нашел об этом упоминание в BOL - есть только по теме UPDATE, compatibility issues
...
Рейтинг: 0 / 0
14.05.2001, 18:08
    #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
14.05.2001, 18:57
    #32005642
REX_X
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хотите постучаться лбом об дерево?
Alexander, про книжечку можно и на мыло написАть: alhen@ukr.net
...
Рейтинг: 0 / 0
14.05.2001, 19:15
    #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
15.05.2001, 09:25
    #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
15.05.2001, 10:16
    #32005669
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хотите постучаться лбом об дерево?
2Genady
В приведенной цитате имеются ввиду outer joins in the WHERE которые выглядят как where field1*=field2
...
Рейтинг: 0 / 0
15.05.2001, 10:31
    #32005671
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хотите постучаться лбом об дерево?
2 SergSuper

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


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