可以说我有下表
User_ID Manager_ID
---------------------
Linda Jacob
Mark Linda
Kevin Linda
Steve Mark
John Kevin
Run Code Online (Sandbox Code Playgroud)
基本上,要求是将所有管理器拉到您要搜索的user_id下.所以,例如,如果我发送'琳达'然后它应该返回我:
'Mark', 'Kevin', 'Steve', 'John'
Run Code Online (Sandbox Code Playgroud)
或者,如果我发送'马克',那么它应该归还给我:
Steve
Run Code Online (Sandbox Code Playgroud)
我听说过递归函数,但我不确定如何做到这一点.任何帮助,将不胜感激.
假设有一个关系表(entity_id,relationship,related_id)
1, A, 2
1, A, 3
3, B, 5
1, C, null
12, C, 1
100, C, null
Run Code Online (Sandbox Code Playgroud)
我需要一个将拉出所有相关行的查询.例如,如果我查询entity_id = 1,则应拉出以下行
1, A, 2
1, A, 3
3, B, 5
1, C, null
12, C, 1
Run Code Online (Sandbox Code Playgroud)
实际上,如果我查询entity_id = 1,2,3,5或12,结果集应该是相同的.
这与标准的经理 - 员工范例不同,因为没有层次结构.这种关系可以向任何方向发展.
编辑 迄今为止发布的答案都没有奏效.
我能够提出一个有效的解决方案.
我会把解决方案归功于能够将这种怪物清理成更优雅的东西的人.
with tab as (
-- union for reversals
select id, entity_id, r.related_id, 1 level
, cast('/' + cast(entity_id as varchar(1000)) + '/' as varchar(1000)) path
from _entity_relation r
where not exists(select null from …Run Code Online (Sandbox Code Playgroud) 我正在阅读关于Spring Security的内容,并想知道是否可以将Spring ACL与hibernate和分页一起使用.生成的SQL肯定是可怕的,但可以自动生成.如果数据库支持递归查询评估,甚至可以使用分层ACL.
使用后置过滤器不是解决方案,因为它破坏了分页,与数据库内的ACL过滤相比,这是一种不必要的开销.
所以我实际上已经有了建立解决方案的部分.我想知道是否有人已经这样做了.
链接:
pagination hibernate spring-security recursive-query spring-security-acl
在PostgreSQL中,另一个WITH可以使用WITH,例如:
WITH num AS (
VALUES (50)
), num2 AS (
SELECT column1 * 2 AS value FROM num
)
SELECT value FROM num2;
Run Code Online (Sandbox Code Playgroud)
还有RECURSIVE WITHs,可以这样做:
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;
Run Code Online (Sandbox Code Playgroud)
但到目前为止,我还没有找到一种方法让RECURSIVE WITH使用之前的WITH.我认为它应该是这样的:
WITH num AS (
VALUES (50)
), num2 AS (
SELECT column1 * 2 AS value FROM num
), RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM …Run Code Online (Sandbox Code Playgroud) 我想在MySQL数据库中表示递归的父子关系.我想创建一个category- subcategory关系.一个类别可以有N个子类别,每个子类别可以有N个子类别,依此类推.我正在考虑让一个category带有外键的表指向它自己.这就是我的意思:
CREATE TABLE `category` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`parent_category` int NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`parent_category`) REFERENCES `category` (`id`)
)
Run Code Online (Sandbox Code Playgroud)
parent_category 如果类别是顶级类别,则可以为null.
这是表示这样的关系的正确方法吗?在我的设计(性能,查询......)中还应该考虑其他事项吗?
我在PostgreSQL数据库中有一个表,它包含树形式的部分地址,如下所示:
Id | Name | ParentId
1 | London | 0
2 | Hallam Street| 1
3 | Bld 26 | 2
4 | Office 5 | 3
Run Code Online (Sandbox Code Playgroud)
我想查询返回一个地址,从所有祖先名称连接.我需要结果表是这样的:
Id | Address
1 | London
2 | London, Hallam Street
3 | London, Hallam Street, Bld 26
4 | London, Hallam Street, Bld 26, Office 5
Run Code Online (Sandbox Code Playgroud)
我想我必须使用WITH RECURSIVE查询,但我发现的所有示例都使用where子句,所以我必须WHERE name='Office 5'只为该特定行设置结果.但是我的初始表的每一行都需要一个连接的地址.如何才能做到这一点?
我想请教一些关于理解"递归"如何工作的帮助.更确切地说,为什么锚查询(非递归项)不会复制到CTE的子调用中.我尽力单独理解,但我不确定.
首先让我们以PostgreSQL为例,这是我发现的最简单的一个(总和为1到100):
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 100)
SELECT sum(n) FROM t;
Run Code Online (Sandbox Code Playgroud)
我的代码演练(我使用下面的链接):
评估非递归术语.对于UNION [...].
在递归查询的结果中包括所有剩余的行,并将它们放在临时工作表中.
只要工作表不为空,请重复以下步骤:
评估递归项,用工作表的当前内容替换递归自引用.对于UNION [...].在递归查询的结果中包括所有剩余行,并将它们放在临时中间表中.
用中间表的内容替换工作表的内容,然后清空中间表."
LVL 0:
非递归部分
递归部分
(这是我想的那部分) - 取代WORKING TABLE
因此递归t将使用WORKING TABLE来执行SELECT n + 1并将结果放在INTERMEDIATE TABLE中.
UNION ALL
然后我们通过t的调用进入下一个lvl?(因为END条件WHERE n <100 = FALSE)
LVL 1:
我们知道coz postgreSQL说它"只要工作表不为空,重复递归步骤"所以它将重复步骤2.和3.(如果我是正确的)直到END条件然后执行SUM.
但是,如果我只是通过下一个t的调用,我们不应该首先执行VALUES(1)吗?
我真的很困惑它是如何可能的.
最好的问候,Falt4rm
database postgresql recursion recursive-query with-statement
我有一个问题,就是无法理解...
我有一张桌子,country_neighbour看起来像这样。
Country_name Country_id Neighbour_name Neighbour_id
Italy 1 France 2
Italy 1 Switzerland 6
Italy 1 Austria 5
France 2 Spain 3
France 2 Italy 1
France 2 Switzerland 6
Spain 3 France 2
Spain 3 Portugal 4
Portugal 4 Spain 3
Run Code Online (Sandbox Code Playgroud)
我想得到的是从一个国家到另一个国家的最短路径。我要说的是,我想知道从意大利到葡萄牙要跨越多少个边界。
(意大利->法国)1
(意大利->法国->西班牙->葡萄牙)3
我一直在寻找想法,并发现WITH CTE是解决我的问题的一种好方法,但MySQL不支持
有谁能指出我正确的方向。感谢您能获得的所有帮助。谢谢。
我正在尝试应用CTE和递归查询.数据库是MariaDB 10.2或更高版本.
业务规则如下:
我的架构如下(注释char用于id类型仅用于说明目的,但我将真正使用int):
CREATE TABLE IF NOT EXISTS accounts (
id CHAR(4) NOT NULL,
name VARCHAR(45) NOT NULL,
type ENUM('holding', 'portfolio') NULL,
PRIMARY KEY (id))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS holdings (
accounts_id CHAR(4) NOT NULL,
value DECIMAL(6,2) NOT NULL,
active TINYINT NOT NULL,
PRIMARY KEY (accounts_id),
CONSTRAINT fk_holdings_accounts
FOREIGN KEY (accounts_id)
REFERENCES accounts (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE …Run Code Online (Sandbox Code Playgroud) sql recursion recursive-query common-table-expression mariadb
我正在努力转换
a | a1,a2,a3
b | b1,b3
c | c2,c1
Run Code Online (Sandbox Code Playgroud)
至:
a | a1
a | a2
a | a3
b | b1
b | b2
c | c2
c | c1
Run Code Online (Sandbox Code Playgroud)
以下是sql格式的数据:
CREATE TABLE data(
"one" TEXT,
"many" TEXT
);
INSERT INTO "data" VALUES('a','a1,a2,a3');
INSERT INTO "data" VALUES('b','b1,b3');
INSERT INTO "data" VALUES('c','c2,c1');
Run Code Online (Sandbox Code Playgroud)
解决方案可能是递归的公共表表达式。
这是一个与单行相似的示例:
WITH RECURSIVE list( element, remainder ) AS (
SELECT NULL AS element, '1,2,3,4,5' AS remainder
UNION ALL
SELECT
CASE
WHEN INSTR( remainder, ',' )>0 THEN …Run Code Online (Sandbox Code Playgroud) recursive-query ×10
sql ×6
postgresql ×3
recursion ×3
mysql ×2
sql-server ×2
database ×1
dijkstra ×1
hibernate ×1
mariadb ×1
pagination ×1
sqlite ×1
t-sql ×1