2014-02-18 107 views
0

我在我的數據庫中有以下關係;大遞歸SQL查詢

Column |   Type   | Modifiers 
----------+----------------------+----------- 
country1 | character varying(4) | not null 
country2 | character varying(4) | not null 
length | numeric    | 

帶有示例數據

country1 | country2 | length 
----------+----------+-------- 
AL  | GR  | 282 
AL  | MK  | 151 
AL  | MNE  | 172 
AL  | KOS  | 112 

,我想在那裏我找到了所有可從陸路法國所能夠到達的國家寫一個遞歸查詢。我會如何去做這件事?

我想出了這個至今:

WITH Recursive frborders(country) AS 
(
SELECT country1 FROM borders WHERE country2 = 'FR' 
) 

SELECT name FROM frborders; 

但我沒有得到期望的結果,我怎麼會去這樣做?我正在使用PostgreSQL。

+0

你應該指定你正在使用的數據庫。 –

+0

我使用PostgreSQL,但不想使用限制它的語法。 – Stabbah

+0

僅供參考,如果您使用的是PostgreSQL,那麼您只能使用PostgreSQL中有效的語法。 – valverij

回答

0

你這樣做的方式(至少在你要去的方向)在不同的平臺上會有所不同。在PostgreSQL中,您需要實際調用您的語句,因此:

WITH RECURSIVE frborders (country1, path) AS (
    SELECT country1, ARRAY['FR']::varchar[] AS "array" 
    FROM borders 
    WHERE country2 = 'FR' 
    UNION ALL 
    SELECT borders.country1, borders.country2||path 
    FROM frborders, borders 
    WHERE borders.country2 = frborders.country1 
) 
select * from frborders; 

做了類似我想象的事情。我添加了一條路徑讓我更清楚。

SQL Server上的語法類似但不同,並且沒有數組,因此路徑將不起作用(但您不希望這樣做)。在MySQL上,你可以使用臨時表和存儲過程來做到這一點,但它看起來不像這樣。有一個獨立於平臺的方法可以做到這一點,但它需要一個非常不同的表結構。另外,您至少需要一個'FR'邊框條目。

+0

遞歸公用表表達式*是獨立於平臺的方式。儘管語法略有不同,但是所有現代數據庫管理系統都支持這種* *(除了MySQL--它幾乎不是「現代」的) –