|
|
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Есть табличка table в ней поле id и parent_id соответственно parent_id ссылается на поле id в этой же табличке. родитель верхнего уровня parent_id - empty Дан id дочерней записи причем уровень вложенности мне не известен заранее. Как мне выбрать все родительские записи до самого верха, в табличку такой же структуры. Это одним селектом реально сделать? ______________________________________ Strong ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 14:33 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
StrongЕсть табличка table в ней поле id и parent_id соответственно parent_id ссылается на поле id в этой же табличке. родитель верхнего уровня parent_id - empty Дан id дочерней записи причем уровень вложенности мне не известен заранее. Как мне выбрать все родительские записи до самого верха, в табличку такой же структуры. Это одним селектом реально сделать? ______________________________________ Strong Одним селектом нет. А вот одним селектом в цикле while - да (условие выхода из цикла - пустая выборка). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 14:42 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
А если через какую нибудь пользовательскую функцию в селекте? Мне что то никак не идет в голову решение. селект в цикле никак не пойдет. ______________________________________ Strong ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 14:49 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Для поиска всех родителей одним селектом не обойтись, но если у вас все это отображается через ActiveX Microsoft TreeView, то у Node есть свойство FullPath, которое показывает полный пусть к объекту. Разделитель вы устанавливаете сами (TreeView.PathSeparator). С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 15:44 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Если написать функцию например *Function RET_S LPARAMETERS _id LOCAL _s _s=TRANSFORM(_id) IF SEEK(_id,'table','id') AND table.parent_id#0 _s=_s+","+RET_S(table.parent_id) ENDIF RETURN _s Таблица должна быть проиндексирована по полю ID Тогда можно выбрать одним запросом SELECT * from table WHERE ","+transform(ID)+","$","+RET_S(23)+"," ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 16:58 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
в примере цифра 23 это id дочерней записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 17:00 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
__Владимир__Если написать функцию например Спасибо большое, я написал что то похожее только хуже: длинее и не так изящно. :-( рекурсию не догнал использовать :-( Ваше решение как раз то что надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 19:25 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Hi __Владимир__! Ты серьёзно полагаешь, что столь "вольное" обращение с таблицей, с которой будет работать SELECT в UDF не приведёт к весьма печальным последствиям? Ну что-ж, блажен кто верует... Или может стоит процитировать соответствующий раздел хелпа... User-Defined Functions in SQL SELECT Statements You can specify expressions containing user-defined functions for Select_Item in SQL SELECT statements. However, note the following recommendations and restrictions when using user-defined functions in SQL SELECT statements: Use API and user-defined functions written in C or assembly language instead of performing high-volume manipulations with user-defined functions. The speed at which user-defined functions are executed can limit the speed of operations performed with SQL SELECT. Assume nothing about the Visual FoxPro input/output (I/O) or table environment when using user-defined functions in SQL SELECT. In general, you do not know which work area is selected, the name of the current table, or even the names of the fields being processed. The value of these variables depends on the precise location in the optimization process where the user-defined function is called. Do not change the Visual FoxPro I/O or table environment in user-defined functions called in SQL SELECT. In general, the results can be unpredictable. Use the argument list that is passed to the function when it is called as the only reliable way to pass values to user-defined functions in SQL SELECT. Understand that "forbidden" manipulations might provide results in one version of Visual FoxPro but might not work in later versions. Outside of these restrictions, user-defined functions are acceptable in SQL SELECT statements. However, remember that using SQL SELECT in general might slow performance. Уж сам посмотри какие из указанных тут пунктов ты нарушаешь... P.S. Кстати в Oracle давным давно есть специального рода конструкция в запросах, для "разузлования" иерархических структур - как "вверх по иерархии" так и в обратном порядке. Я не в курсе реализована ли такая функциональность в каких либо иных СУБД... Но уж если делать на UDF - то писать эту UDF надо ОСОБЕННО тщательно - и без рекурсии, и позаботившись об "изоляции" тех курсоров с которыми работает собственно SELECT от "рабочего" курсора в UDF. Если же важна высокая производительность, то наверное стоит подумать о некоторой денормализации структуры, введении разного рода хитрых оптимизационных полей - ну например поля, в котором хранится в "закодированном" виде весь иерархический путь - от корня до данного объекта - и соответствующие процедуры для "пересчёта" этого поля... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2006, 20:09 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi __Владимир__! Ты серьёзно полагаешь, что столь "вольное" обращение с таблицей, с которой будет работать SELECT в UDF не приведёт к весьма печальным последствиям? Ну что-ж, блажен кто верует... Полностью согласен с Вами. Лично я не увлекаюсь такими запросами. Но постановка задачи была - одним запросом. Такой трюк проходит только в VFP, что не получится в других языках! Мой совет- предварительно сформировать строку поиска и уже её подставить в запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 09:47 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Hi __Владимир__! Да нет, UDF такого рода будут работать много где (хотя почти всегда это будет являться наименее оптимальным вариантом из всех возможных) - главное при их написании соблюдать известную аккуратность и учитывать требования используемого языка. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2006, 02:35 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi __Владимир__! Да нет, UDF такого рода будут работать много где (хотя почти всегда это будет являться наименее оптимальным вариантом из всех возможных) - главное при их написании соблюдать известную аккуратность и учитывать требования используемого языка. Со всеми вашими доводами абсолютно согласен, однако ИМХО относительно моей ситуации UDF предпочтительней если не вообще не единственное решение, судите сами: а) программа выгружает определенные даные б) производительность требуется на уровне - время работы программы не более 2 минут примерно. в) за 1 раз планируется выгружать не более 1000 строк данных, реально и того меньше ( работа сделаная оператором за день, пол дня и т.д.) г) при этом требуется определенная гибкость в том какие данные нужно выгружать, сегодня это может быть одни данные - завтра потребуются другие В общем сделал определенный метод работающий со списком данных о необходимых таблицах. список обрабатывается - формируется динамический селект (и все остальное) и соотв. выполняется писать селекты подряд дело неблагодарное, поскольку более 80% таблиц выгружаются со всеми полями и без особых заморочек. делать спец кусок для каждой таблицы которая не влезает в эту схему ИМХО вернусь к варианту с кучей чуть разных селектов. С удовольствием выслушаю любую критику и советы. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 11:13 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
В этом случае, меняют структуру данных. Т.е. к основным ID, ParentID добавляют некие избыточные поля, которые позволяют получать выборку "одним запросом". Разумеется, эти избыточные поля требуют сопровождения. UDF - далеко не единственный способ. И вообще, Select-SQL не всегда самый быстрый способ получения выборки. Тут надо экспериментировать. Возможно, обычная рекурсия окажется быстрее чем Select-SQL с UDF. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 19:34 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Hi Владимир! > UDF - далеко не единственный способ. И вообще, Select-SQL не всегда самый > быстрый способ получения выборки А вот когда внутри UDF используется SELECT (даже если она идёт в массив), а потом эта самая UDF используется в другом SELECT - то это вообще жутко медленно :) Ибо огромные затраты на собственно "вызов UDF" (А для SELECT таких вызовов будет столько, сколько записей попадает в отбор!) И очень велики затраты на разбор и выполнение SELECT-а (а таковых действий как раз и будет столько, сколько раз вызывается UDF). Впрочем тут вопрос скорости не стоит, так что можно действительно использовать UDF - НО его нужно написать ОЧЕНЬ корректно - так чтобы не нарушать принципов описанных в хелпе. В частности "поиск" производить не по тому же самому курсору из которого идёт отбор, а открыть через USE ... AGAIN ещё один курсор для данной таблицы - и уже в нём искать... Я бы наверное заодно избавился от рекурсии в пользу цикла (чтобы снизить затраты на многократный вызов UDF) - пусть это и приведёт к чуть более массивному коду. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2006, 18:09 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
уговорили! Вообще как правильно выполнять типовые действия. каким образом наиболее корректно организовать однотипные действия с данными, тем более без динмически формируемого селекта? ______________________________________ Strong ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2006, 18:05 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Встречный вопрос, что изменить чтоб выдавало всех потомков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2006, 16:20 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
неужели никто не знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 19:33 |
|
||
|
Выбрать все родительские записи
|
|||
|---|---|---|---|
|
#18+
Jevgeniyнеужели никто не знает? Не стоит поднимать старые темы. Лучше создавай новые. Посмотри вот это обсуждение /topic/201372&pg=1 Я там приводил ссылки, но некоторые из них уже устарели. Поищи "вокруг" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 20:38 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=218&tid=1590118]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 361ms |

| 0 / 0 |
