下面是我在SQLite中成功使用的一个查询。它创建了属于"Pak“的所有链接的层次结构。
WITH LinkTree(link_id, link_pid, pak_id, link_name, depth)
AS
(
SELECT *, 0 AS depth FROM links
WHERE link_pid = 0
UNION ALL
SELECT l.*, lt.depth+1 AS depth FROM LinkTree lt
JOIN links l ON (lt.link_id = l.link_pid)
)
SELECT * FROM LinkTree WHERE pak_id = 1; 我试图对其进行修改,使其与Postgres一起工作,但我说“深度”是一种矛盾的说法是错误的。
有两个简单的表:
Paks: pak_id, pak_name
Links: link_id, link_pid, link_name, pak_id所有列都是整数,但*_name是varchars。
有谁可以帮我?
发布于 2015-10-31 19:39:39
我认为您需要RECURSIVE关键字:
WITH RECURSIVE LinkTree(link_id, link_pid, pak_id, link_name, depth)
AS
(
SELECT *, 0 AS depth FROM links
WHERE link_pid = 0
UNION ALL
SELECT l.*, lt.depth+1 AS depth FROM LinkTree lt
JOIN links l ON (lt.link_id = l.link_pid)
)
SELECT * FROM LinkTree WHERE pak_id = 1; 编辑:
不要在select中使用*:
WITH LinkTree(link_id, link_pid, pak_id, link_name, depth)
AS
(
SELECT link_id, link_pid, pak_id, link_name, 0 AS depth
FROM links
WHERE link_pid = 0
UNION ALL
SELECT l.link_id, l.link_pid, l.pak_id, l.link_name, lt.depth+1 AS depth
FROM LinkTree lt
JOIN links l
ON lt.link_id = l.link_pid
)
SELECT *
FROM LinkTree
WHERE pak_id = 1; https://stackoverflow.com/questions/33455801
复制相似问题