powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выбрать все родительские записи
17 сообщений из 17, страница 1 из 1
Выбрать все родительские записи
    #33635213
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть табличка table
в ней поле id и parent_id
соответственно parent_id ссылается на поле id в этой же табличке.
родитель верхнего уровня parent_id - empty

Дан id дочерней записи
причем уровень вложенности мне не известен заранее.

Как мне выбрать все родительские записи до самого верха, в табличку такой же структуры. Это одним селектом реально сделать?


______________________________________
Strong
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33635260
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StrongЕсть табличка table
в ней поле id и parent_id
соответственно parent_id ссылается на поле id в этой же табличке.
родитель верхнего уровня parent_id - empty

Дан id дочерней записи
причем уровень вложенности мне не известен заранее.

Как мне выбрать все родительские записи до самого верха, в табличку такой же структуры. Это одним селектом реально сделать?


______________________________________
Strong
Одним селектом нет. А вот одним селектом в цикле while - да (условие выхода из цикла - пустая выборка).
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33635280
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если через какую нибудь пользовательскую функцию в селекте?
Мне что то никак не идет в голову решение.
селект в цикле никак не пойдет.

______________________________________
Strong
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33635509
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для поиска всех родителей одним селектом не обойтись, но если у вас все это отображается через ActiveX Microsoft TreeView, то у Node есть свойство FullPath, которое показывает полный пусть к объекту. Разделитель вы устанавливаете сами (TreeView.PathSeparator).
С уважением, Алексей
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33635792
Если написать функцию например
*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)+","
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33635797
в примере цифра 23 это id дочерней записи
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33636176
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Владимир__Если написать функцию например


Спасибо большое,
я написал что то похожее только хуже:
длинее и не так изящно. :-(
рекурсию не догнал использовать :-(
Ваше решение как раз то что надо.
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33639868
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33640257
Igor Korolyov
Hi __Владимир__!

Ты серьёзно полагаешь, что столь "вольное" обращение с таблицей, с которой
будет работать SELECT в UDF не приведёт к весьма печальным последствиям? Ну
что-ж, блажен кто верует...

Полностью согласен с Вами.
Лично я не увлекаюсь такими запросами. Но постановка задачи была - одним запросом.
Такой трюк проходит только в VFP, что не получится в других языках!
Мой совет- предварительно сформировать строку поиска и уже её подставить в запрос.
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33642345
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi __Владимир__!

Да нет, UDF такого рода будут работать много где (хотя почти всегда это
будет являться наименее оптимальным вариантом из всех возможных) - главное
при их написании соблюдать известную аккуратность и учитывать требования
используемого языка.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33645549
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi __Владимир__!

Да нет, UDF такого рода будут работать много где (хотя почти всегда это
будет являться наименее оптимальным вариантом из всех возможных) - главное
при их написании соблюдать известную аккуратность и учитывать требования
используемого языка.



Со всеми вашими доводами абсолютно согласен, однако ИМХО относительно моей ситуации UDF предпочтительней если не вообще не единственное решение, судите сами:

а) программа выгружает определенные даные
б) производительность требуется на уровне - время работы программы не более 2 минут примерно.
в) за 1 раз планируется выгружать не более 1000 строк данных, реально и того меньше ( работа сделаная оператором за день, пол дня и т.д.)
г) при этом требуется определенная гибкость в том какие данные нужно выгружать, сегодня это может быть одни данные - завтра потребуются другие

В общем сделал определенный метод работающий со списком данных о необходимых таблицах.
список обрабатывается - формируется динамический селект (и все остальное) и соотв. выполняется
писать селекты подряд дело неблагодарное, поскольку более 80% таблиц выгружаются со всеми полями и без особых заморочек.

делать спец кусок для каждой таблицы которая не влезает в эту схему ИМХО вернусь к варианту с кучей чуть разных селектов.

С удовольствием выслушаю любую критику и советы. Спасибо.
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33647429
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом случае, меняют структуру данных. Т.е. к основным ID, ParentID добавляют некие избыточные поля, которые позволяют получать выборку "одним запросом". Разумеется, эти избыточные поля требуют сопровождения.

UDF - далеко не единственный способ. И вообще, Select-SQL не всегда самый быстрый способ получения выборки. Тут надо экспериментировать. Возможно, обычная рекурсия окажется быстрее чем Select-SQL с UDF.
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33654429
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Владимир!

> UDF - далеко не единственный способ. И вообще, Select-SQL не всегда самый
> быстрый способ получения выборки

А вот когда внутри UDF используется SELECT (даже если она идёт в массив), а
потом эта самая UDF используется в другом SELECT - то это вообще жутко
медленно :)
Ибо огромные затраты на собственно "вызов UDF" (А для SELECT таких вызовов
будет столько, сколько записей попадает в отбор!) И очень велики затраты на
разбор и выполнение SELECT-а (а таковых действий как раз и будет столько,
сколько раз вызывается UDF).

Впрочем тут вопрос скорости не стоит, так что можно действительно
использовать UDF - НО его нужно написать ОЧЕНЬ корректно - так чтобы не
нарушать принципов описанных в хелпе. В частности "поиск" производить не по
тому же самому курсору из которого идёт отбор, а открыть через USE ... AGAIN
ещё один курсор для данной таблицы - и уже в нём искать... Я бы наверное
заодно избавился от рекурсии в пользу цикла (чтобы снизить затраты на
многократный вызов UDF) - пусть это и приведёт к чуть более массивному коду.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #33659326
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уговорили!

Вообще как правильно выполнять типовые действия.
каким образом наиболее корректно организовать однотипные действия с данными, тем более без динмически формируемого селекта?

______________________________________
Strong
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #34205760
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Встречный вопрос, что изменить чтоб выдавало всех потомков?
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #34211473
Jevgeniy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
неужели никто не знает?
...
Рейтинг: 0 / 0
Выбрать все родительские записи
    #34211558
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jevgeniyнеужели никто не знает?
Не стоит поднимать старые темы. Лучше создавай новые.

Посмотри вот это обсуждение

/topic/201372&pg=1

Я там приводил ссылки, но некоторые из них уже устарели. Поищи "вокруг"
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выбрать все родительские записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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