我的数据库中有以下关系;
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上,你需要实际上递归地调用你的语句,因此:
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”至少需要一个边框条目。