Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
И снова про CONNECT BY
|
|||
|---|---|---|---|
|
#18+
Привет всем! Перейду сразу к сути проблемы: Имеется 2 таблички: CREATE TABLE msgs ( id serial NOT NULL, message varchar, id_firm_from int4, "level" int4 DEFAULT 100, CONSTRAINT messages_pkey PRIMARY KEY (id), CONSTRAINT "$1" FOREIGN KEY (id_firm_from) REFERENCES firms (id) ON UPDATE CASCADE ON DELETE CASCADE ) WITH OIDS; CREATE TABLE firms_msgs ( id_firm int4 NOT NULL, id_msg int4 NOT NULL, _id_parent int4, _level int4, CONSTRAINT "$1" FOREIGN KEY (id_firm) REFERENCES firms (id) ON UPDATE RESTRICT ON DELETE RESTRICT, CONSTRAINT "$2" FOREIGN KEY (id_msg) REFERENCES msgs (id) ON UPDATE RESTRICT ON DELETE RESTRICT ) -------------- Фирмы иерархичны, куча полей, достаточно знать, что там есть id и id_parent. Требуется выбрать все сообщения по иерархии от какой-то фирмы вниз. Имеется 2 запроса (на кривость не смотреть, "красивые" запросы тоже обламываются): ----- 1. select * from msgs where id_firm_from in (select sub.id from ( select id,id_parent from firms connect by prior id=id_parent start with id=<ID ФИРМЫ> ) as sub) выдает 1 запись, а ----- 2. select * from msgs where id_firm_from in (select sub.id from ( select id,id_parent, from firms where id in (<ID ТОЙЖЕ ФИРМЫ>) ) as sub) уже выдает почти все нужные записи ----- Т.е. 1-й запрос в IN () имеет большее количество записей, но в конечном итоге выдает меньше. В то время, как 2-й имеет в IN всего одну запись, но выдает больше. Вот более короткий запрос, который делает то же самое и не работает: 3. select * from msgs where id_firm_from in (select id from firms connect by prior id=id_parent start with id=<ID ФИРМЫ>) Сам подзапрос в этом случае выдает всё, что от него ожидается, т.е. иерархию фирм. Интересно: если в запрос 1. добавить DISTINCT, к примеру или LIMIT: 4. select * from msgs where id_firm_from in (select DISTINCT sub.id from ( select id,id_parent from firms connect by prior id=id_parent start with id=<ID ФИРМЫ> ) as sub) 5. select * from msgs where id_firm_from in (select sub.id from ( select id,id_parent from firms connect by prior id=id_parent start with id=<ID ФИРМЫ> ) as sub limit 10000) -- Реально там нет 10000 записей, т.е. выбираем всё -------- то всё начинает работать на УРА, правда, до определенного значения limit. Т.е. если, например, указать limit 100000, то уже облом, опять 1 запись вместо 50 нужных... Короче, хелп P.S. Запрос номер 6 (и 7) работает, но в нем добавлена только сортировка: 6. select * from msgs where id_firm_from in (select sub.id from ( select id,id_parent from firms connect by prior id=id_parent start with id=<ID ФИРМЫ> ) as sub order by id) или более коротко: 7. select * from messages where id_dealer_from in (select id from dealers connect by prior id=id_parent start with id=158 order by id) Уж не знаю, что и думать теперь :( Без сортировки выдается 1 запись, с сортировкой - все. Дважды хелп. DB: Postgres 8.0 OS: Red Hat ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 13:14 |
|
||
|
И снова про CONNECT BY
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, промазал :) Последний запрос выглядит иначе (экспериментировал): 7. select * from msgs where id_firm_from in (select id from firms connect by prior id=id_parent start with id=<ID ФИРМЫ> order by id) -------------- Для тех, кому лень читать - квинтэссенция вышеописанного :) Работает: select * from msgs where id_firm_from in (select id from firms connect by prior id=id_parent start with id=<ID ФИРМЫ> order by id) Не работает: select * from msgs where id_firm_from in (select id from firms connect by prior id=id_parent start with id=<ID ФИРМЫ>) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 13:19 |
|
||
|
И снова про CONNECT BY
|
|||
|---|---|---|---|
|
#18+
Все это хорошо. Ты лучше скажи, откуда ты connect by в Postgres-е взял? Есть библиотека стабильная? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2006, 23:09 |
|
||
|
И снова про CONNECT BY
|
|||
|---|---|---|---|
|
#18+
посмотри в сторону ltree. С этой библой гораздо проще жить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2006, 07:56 |
|
||
|
И снова про CONNECT BY
|
|||
|---|---|---|---|
|
#18+
Funny_FalconВсе это хорошо. Ты лучше скажи, откуда ты connect by в Postgres-е взял? Есть библиотека стабильная? То-то и оно, что это патч HIER. Пока деваться некуда, но нужно будет, видимо, переходить на другой вариант с такими косяками... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2006, 10:54 |
|
||
|
И снова про CONNECT BY
|
|||
|---|---|---|---|
|
#18+
SOmni Funny_FalconВсе это хорошо. Ты лучше скажи, откуда ты connect by в Postgres-е взял? Есть библиотека стабильная? То-то и оно, что это патч HIER. Пока деваться некуда, но нужно будет, видимо, переходить на другой вариант с такими косяками... и все таки где взять его под 8.2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 12:10 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=2003882]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 399ms |

| 0 / 0 |
