🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #194277

Re: PostgreSQL - dziwny błąd składni zapytania

#194277
From: Marek
Date: Fri, 06 Feb 2015 18:00
75 lines
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-mail
References: <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