Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / И снова про CONNECT BY / 6 сообщений из 6, страница 1 из 1
24.04.2006, 13:14
    #33686038
SOmni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова про CONNECT BY
Привет всем! Перейду сразу к сути проблемы:
Имеется 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
...
Рейтинг: 0 / 0
24.04.2006, 13:19
    #33686055
SOmni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова про CONNECT BY
Прошу прощения, промазал :)
Последний запрос выглядит иначе (экспериментировал):
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 ФИРМЫ>)
...
Рейтинг: 0 / 0
24.04.2006, 23:09
    #33687365
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова про CONNECT BY
Все это хорошо. Ты лучше скажи, откуда ты connect by в Postgres-е взял? Есть библиотека стабильная?
...
Рейтинг: 0 / 0
25.04.2006, 07:56
    #33687554
valera_k2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова про CONNECT BY
посмотри в сторону ltree. С этой библой гораздо проще жить...
...
Рейтинг: 0 / 0
25.04.2006, 10:54
    #33687994
SOmni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова про CONNECT BY
Funny_FalconВсе это хорошо. Ты лучше скажи, откуда ты connect by в Postgres-е взял? Есть библиотека стабильная?
То-то и оно, что это патч HIER. Пока деваться некуда, но нужно будет, видимо, переходить на другой вариант с такими косяками...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
13.11.2008, 12:10
    #35651266
qazxc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова про CONNECT BY
SOmni Funny_FalconВсе это хорошо. Ты лучше скажи, откуда ты connect by в Postgres-е взял? Есть библиотека стабильная?
То-то и оно, что это патч HIER. Пока деваться некуда, но нужно будет, видимо, переходить на другой вариант с такими косяками...

и все таки где взять его под 8.2?
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / И снова про CONNECT BY / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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