gpt4 book ai didi

没有递归的sql递归

转载 作者:行者123 更新时间:2023-11-29 11:20:14 36 4
gpt4 key购买 nike

我有四张 table

create table entities{
integer id;
string name;
}

create table users{
integer id;//fk to entities
string email;
}

create table groups{
integer id;//fk to entities
}

create table group_members{
integer group_id; //fk to group
integer entity_id;//fk to entity
}

我想进行查询,返回用户直接或间接所属的所有组。显而易见的解决方案是在应用程序级别进行递归。我想知道我可以对我的数据模型进行哪些更改以减少数据库访问并因此获得更好的性能。

最佳答案

Oracle 中:

SELECT  group_id
FROM group_members
START WITH
entity_id = :user_id
CONNECT BY
entity_id = PRIOR group_id

SQL Server 中:

WITH    q AS
(
SELECT group_id, entity_id
FROM group_members
WHERE entity_id = @user_id
UNION ALL
SELECT gm.group_id, gm.entity_id
FROM group_members gm
JOIN q
ON gm.entity_id = q.group_id
)
SELECT group_id
FROM q

PostgreSQL 8.4 中:

WITH RECURSIVE
q AS
(
SELECT group_id, entity_id
FROM group_members
WHERE entity_id = @user_id
UNION ALL
SELECT gm.group_id, gm.entity_id
FROM group_members gm
JOIN q
ON gm.entity_id = q.group_id
)
SELECT group_id
FROM q

PostgreSQL 8.3 及以下版本中:

CREATE OR REPLACE FUNCTION fn_group_members(INT)
RETURNS SETOF group_members
AS
$$
SELECT group_members
FROM group_members
WHERE entity_id = $1
UNION ALL
SELECT fn_group_members(group_members.group_id)
FROM group_members
WHERE entity_id = $1;
$$
LANGUAGE 'sql';

SELECT group_id
FROM group_members(:myuser) gm

关于没有递归的sql递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1323245/

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