大递归SQL查询

时间:2014-02-18 17:44:55

标签: sql postgresql recursion common-table-expression

我的数据库中有以下关系;

  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。

1 个答案:

答案 0 :(得分: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”至少需要一个边框条目。