Article View: pl.comp.bazy-danych
Article #194277Re: PostgreSQL - dziwny błąd składni zapytania
From: Marek
Date: Fri, 06 Feb 2015 18:00
Date: Fri, 06 Feb 2015 18:00
75 lines
3219 bytes
3219 bytes
W dniu 2015-02-06 o 16:28, irq pisze:
> ... bo UNION nie gwarantuje zachowania kolejności wierszy
> poszczególnych składników,
Ahhhh... faktycznie! Masz rację.
Ale... coś mi tu nie pasuje gdyż to implikuje bezcelowość istnienia
zapytania rekurencyjnego WITH RECURSIVE...
Np mamy drzewo kategorii:
CREATE TABLE category (
category_id SERIAL PRIMARY KEY,
parent_id int4 REFERENCES category (category_id)
order_idx int4
...
parent_id to ID rodzica lub null
order_idx oznacza kolejność danej kategorii w gałązce
Chcemy je przerzucić do XMLa więc musimy je przetrawersować
uwzględniając hierarchię. Zapytanie rekurencyjne, które (chyba) do tego
służy, powinno przejść przez tą strukturę rekurencyjnie i zachować
kolejność. a jeśli UNION ALL, które musi być składnikiem tej rekurencji
(bo taka jest składnia) nie gwarantuje kolejności, to cała zabawa traci
sens. Czy też dostrzegasz sprzeczność?
Konkretnie w tym przypadku zrobiłbym tak (co hipotetycznie nie może
zadziałać poprawnie choć działa):
WITH RECURSIVE hierarchy(category_id) AS (
SELECT * FROM --obejście dla niemożności stosowania order by
(SELECT category_id FROM category WHERE parent_idx ISNULL ORDER BY
order_idx) AS table1 -- wybiera w/g kolejności kategorie nadrzędne
UNION ALL
SELECT * FROM --kolejne obejście dla braku sortowania
(SELECT * FROM hierarchy h
JOIN category c ON (c.parent_id=h.category_id)
ORDER BY c.order_idx) AS table2
)
SELECT * FROM hierarchy;
No i zapytanie zwraca mi pięknie posortowane drzewko. Przykładowo gdy
mam rekordy:
category_id | parent_id | nazwa
--------------------------------
1 null k1
2 null k2
3 1 k1.1
4 1 k1.2
5 2 k2.1
6 4 k1.2.1
Daje kolejność:
k1
k1.1
k1.2
k1.2.1
k2
k2.1
Jeśli struktura RECURSIVE WITH nie umiałaby sortować w specyficzny
sposób, to dawałaby taki sam rezultat jak SELECT * FROM category. To jak
to jest z tym UNION ALL, że mimo to nie powoduje iż RECURSIVE WITH
funkcjonuje?
--
Pozdrawiam,
Marek
Technical Details
Message-ID:
<mb2vg7$nsb$1@news.icm.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!.POSTED!not-for-mailReferences:
<mb2588$m86$1@news.icm.edu.pl> <mb2g7f$isp$2@news.icm.edu.pl> <3b7e9e8f-a32d-4718-b91c-2fe350f9d457@googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!.POSTED!not-for-mail From: Marek <precz@spamowi.com> Newsgroups: pl.comp.bazy-danych Subject: Re: PostgreSQL - dziwny błąd składni zapytania Date: Fri, 06 Feb 2015 19:00:33 +0100 Organization: ICM, Uniwersytet Warszawski Lines: 75 Message-ID: <mb2vg7$nsb$1@news.icm.edu.pl> References: <mb2588$m86$1@news.icm.edu.pl> <mb2g7f$isp$2@news.icm.edu.pl> <3b7e9e8f-a32d-4718-b91c-2fe350f9d457@googlegroups.com> NNTP-Posting-Host: 89-69-222-145.dynamic.chello.pl Mime-Version: 1.0 X-Trace: news.icm.edu.pl 1423245639 24459 89.69.222.145 (6 Feb 2015 18:00:39 GMT) X-Complaints-To: usenet@news.icm.edu.pl NNTP-Posting-Date: Fri, 6 Feb 2015 18:00:39 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 In-Reply-To: <3b7e9e8f-a32d-4718-b91c-2fe350f9d457@googlegroups.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit