Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
Есть таблица, в которой находятся записи, образующие дерево. 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() для обхода повторного создания той же таблицы. Что думаете по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 15:16 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
update С set С.Value=P.Value from Tree P, Tree C where P.ID=C.ParentID И наслаждайтесь жизнью - заодно синтакс T-SQL подучите Concerning ambiguous table: с точки зрения здравого смысла - у Вас же две таблицы Tree в запросе - Вы какую обновлять собирались? А с точки зрения синтаксиса у вас есть таблица C и таблица P - и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 15:45 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
2Akexander Chepack У вас случайно не 6-я версия стоит? Дело в том что такие конструкции: update С set С.Value=P.Value from Tree P, Tree C where P.ID=C.ParentID допускались до 6-й версии. В 6.5 уже нет. Вроде как обновление таблицы данными из этой же таблицы - это запрещается каким-то ANSI-стандартом. Насчет временных таблиц в триггерах - а если их заменить переменными-таблицами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 16:00 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
2 SergSuper Не знаю насчет стандарта, только у меня обновление таблицы данными из этой же таблицы успешно прошло по запросу аналогичному Akexander Chepack. MS SQL 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 16:15 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 16:50 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
2 SergSuper Вы невнимательно посмотрели на запрос, нужно так: update а set a.i=b.i from #t a, #t b ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 17:03 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
Проверено. Запрос update C set C.value=P.value from tree P, tree C where C.ParentID=P.ID - работает на 2000-ке, равно как и на 7-ке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 17:13 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
Дело в том что такие конструкции: 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 использовал - хотя это не критично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 17:31 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
Кстати, о деревьях - есть такая книжка SQL for Smarties - очень рекомендую - так куча всяких занятных задачек приведена на SQL'е. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 17:34 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
2 Alexander Chepack Плиз, поподробнее про книжечку, ну там автор и все такое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 17:37 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
Да, пардон, был не прав. Чего только не узнаешь. С трудом нашел об этом упоминание в BOL - есть только по теме UPDATE, compatibility issues ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 17:38 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
А вообще да, 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: а про книжечку на самом деле хотелось бы узнать, ЧТО? ГДЕ? ПО_ЧЕМ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 18:08 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
Alexander, про книжечку можно и на мыло написАть: alhen@ukr.net ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 18:57 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
Ссылка на амазоне: 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. У него еще куча книг есть - я свою, кстати, с этими переездами из страны в страну потерял - да у меня старое издание было, придется снова покупать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2001, 19:15 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
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 пасиба ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2001, 09:25 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
2Genady В приведенной цитате имеются ввиду outer joins in the WHERE которые выглядят как where field1*=field2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2001, 10:16 |
|
||
|
Хотите постучаться лбом об дерево?
|
|||
|---|---|---|---|
|
#18+
2 SergSuper Да речь идет об outer join-ах, потому что в зависимости от того где его задать во from или в where будет возвращаться разный набор строк, где указаывать inner join не имеет значения, результат будет один и тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2001, 10:31 |
|
||
|
|

start [/forum/topic.php?fid=46&tid=1826784]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 377ms |

| 0 / 0 |
