SQLite 到 Postgres 层次结构查询
SQLite to Postgres Hierarchy Query
这是我在 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 一起使用,但我收到一条错误消息说 "depth" 不明确。
使用了两个简单的表格:
Paks: pak_id, pak_name
Links: link_id, link_pid, link_name, pak_id
所有列都是整数,除了 *_name 是 varchars。
谁能帮帮我?
我认为你需要 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;
这是我在 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 一起使用,但我收到一条错误消息说 "depth" 不明确。
使用了两个简单的表格:
Paks: pak_id, pak_name
Links: link_id, link_pid, link_name, pak_id
所有列都是整数,除了 *_name 是 varchars。
谁能帮帮我?
我认为你需要 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;