|
|
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
Интересует мнение сообщества во по какому вопросу: есть таблица с иерархией типа CREATE TABLE TA (ID INTEGER, PARENTID INTEGER, COLUMN1 INTEGER); Как получить все элементы таблицы удовлетворяющие условию, наложенному на поле COLUMN1 или являющиеся родителями таких записей? Ограничения: 1. Условие формируется динамически от действий пользователя. 2. Реально таблицы разные с разным набором полей, изначально неизвестным. Их объединяет только названия ID и PARENTID. 3. Уровень вложения иерархии также неизвестен, но допускается его ограничение. P.S.: Я перечитал все посты на тему рекурсии и дерева, но везде речь идёт о предопределённых таблицах. P.P.S.: И что могут сказать приближенные к разработчикам Firebird/Yaffil на такой запрос в смысле его эффективности: Select TA.ID, TA.PARENTID, TA.COLUMN1 from TA Where (((cast(TA.COLUMN1 as VarChar(250)) = 'XXXXXXX')) or exists ( select ID from TA TA00 left outer join TA TA01 on TA00.ID = TA01.PARENTID left outer join TA TA02 on TA01.ID = TA02.PARENTID left outer join TA TA03 on TA02.ID = TA03.PARENTID left outer join TA TA04 on TA03.ID = TA04.PARENTID left outer join TA TA05 on TA04.ID = TA05.PARENTID where (TA.ID = TA00.PARENTID) and ( ((cast(TA00.COLUMN1 as VarChar(250)) = 'XXXXXXX')) or ((cast(TA01.COLUMN1 as VarChar(250)) = 'XXXXXXX')) or ((cast(TA02.COLUMN1 as VarChar(250)) = 'XXXXXXX')) or ((cast(TA03.COLUMN1 as VarChar(250)) = 'XXXXXXX')) or ((cast(TA04.COLUMN1 as VarChar(250)) = 'XXXXXXX')) or ((cast(TA05.COLUMN1 as VarChar(250)) = 'XXXXXXX')) ))) order by TA.COLUMN1 asc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 10:57 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
Попробовать можно так: делаешь табличку create table result ( id integer, parentid integer); Делашь ХП Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. А потом уже выбираешь целые поля из TA, основываясь на индексах из result. Посмотри. У меня все отработало ОК ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 12:38 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
А вложенным SELECT `ом не пробовал? Или с помощью UNION ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 12:41 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
Возможно так: Запрос можно разбить на 2 части 1. элементы таблицы удовлетворяющие условию, наложенному на поле COLUMN1 Код: plaintext 1. Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 13:23 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
2IGORRR: Всё бы нормально, но в соответствии с ограничением 1 условие where column1 = :param не прокатит. 2FreemanZAV: Запрос с использованием UNION работает похоже дольше по сравнению с описанным мною запросом, это я уже проверял. 2Scream: А это как - вложенным SELECT`ом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 14:20 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
Надо не просто UNION , а именно UNION ALL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 14:27 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
Nikola18, я тебя не понял, > в соответствии с ограничением 1 условие where column1 = :param не прокатит. param - это же входной параметр в ХП, где бы у тебя не формировалось условие на клиенте или сервере - вызывай ХП с этим параметром и все..? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 14:28 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
:param - да, но вот column1 вовсе может быть и не column1, а например: ((column1=1) or (column55=55)) и т.д. ВСЁ условие генерится в зависимости от пользователя, на каком столбце он кликнет такой реквизит и будет, как в Excelе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 14:39 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
2FreemanZAV: Дело в том, что при использовании UNION происходит неоднократное чтение всей исходной таблицы. И чем больше UNIONов тем больше проходов. Поэтому и рекомендуется при возможности избегать объединения и использовать 1 select. А вообще сейчас протестил, то, что только что написал - так и есть. 2ALL: Приведённый в первом моём посте запрос меня бы устроил, но я не уверен в том, как он будет себя вести на базе порядка от 200 тыс. записей и от 5 уровней вложенности. Явно недостаёт возможности CONNECT BY :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 14:53 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
Nikola18 рекомендуется при возможности избегать объединения и использовать 1 select А при использовании exists вложенный запрос выполняется на каждую запись основного запроса, поэтому тормоза могут быть еще больше (но могут и не быть ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 14:58 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
А зачем так много LEFT JOIN в подзапросе? Ведь достаточно определить имеет ли родительский узел потомка, удовлетворяющего условиям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 15:02 |
|
||
|
Where с учётом иерархии
|
|||
|---|---|---|---|
|
#18+
А как вывести вот такое дерево: 1-ый_родитель_ НЕ удовлетворяющий_условию +-- 2-ой_родитель_ НЕ удовлетворяющий_условию | +-- 3-ий_родитель_ НЕ удовлетворяющий_условию | | +-- 4-ый_родитель_ НЕ удовлетворяющий_условию | | | +-- 5-ая_запись_удовлетворяющая_условию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2004, 15:15 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32510866&tid=1578686]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
162ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 463ms |

| 0 / 0 |
