gpt4 book ai didi

sql - 您如何在递归CTE中创建UNION?

转载 作者:行者123 更新时间:2023-12-03 18:52:52 26 4
gpt4 key购买 nike

这里有一个标准的层次表:

CREATE TABLE GroupMembers (
group_id VARCHAR,
member_id VARCHAR
);

INSERT INTO GroupMembers VALUES
('1', '10'),
('1', '11'),
('10','100'),
('10','101'),
('20','200'),
('20','201');


现在,要获取组“ 1”的所有成员,请执行以下操作:

WITH RECURSIVE members(id) AS (
VALUES('1')
UNION
SELECT gm.member_id
FROM GroupMembers gm
INNER JOIN members m ON gm.group_id=m.id
)
SELECT * FROM members;


结果为:“ 1”,“ 10”,“ 11”,“ 100”,“ 101”。

现在有一个新问题:我为id取别名

CREATE TABLE Aliases (
member_id VARCHAR,
alias_id VARCHAR
);

INSERT INTO Aliases(member_id, alias_id) VALUES
('11', '20');


现在我想获得所有成员。由于“ 11”是“ 20”的别名,因此结果应为:“ 1”,“ 10”,“ 11”,“ 100”,“ 101”,“ 200”和“ 201”。

我尝试了以下查询:

WITH RECURSIVE members(id) AS (
VALUES('1')
UNION
SELECT gm.member_id
FROM GroupMembers gm
INNER JOIN members m ON gm.group_id=m.id
UNION
SELECT a.alias_id
FROM Aliases
INNER JOIN members m ON gm.group_id=m.id
)
SELECT * FROM members;


但我收到错误 circular reference: members

最佳答案

这个怎么样:

WITH RECURSIVE members(id) AS (
VALUES('1')
UNION
SELECT groupWithAliases.member_id
FROM
( SELECT group_id, member_id FROM GroupMembers
UNION
SELECT alias_id AS group_id, member_id
FROM Aliases ) groupWithAliases
INNER JOIN members m ON groupWithAliases.group_id=m.id
)
SELECT * FROM members;


请注意,我在构造 groupWithAliases子查询时使用UNION来消除重复项

关于sql - 您如何在递归CTE中创建UNION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23353084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com