标签: recursive-query

sql递归函数 - 查找管理器

可以说我有下表

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)

我听说过递归函数,但我不确定如何做到这一点.任何帮助,将不胜感激.

sql t-sql sql-server stored-procedures recursive-query

5
推荐指数
1
解决办法
3356
查看次数

具有对等关系的递归查询

假设有一个关系表(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)

sql sql-server recursive-query

5
推荐指数
1
解决办法
307
查看次数

如何使用Spring Security,Hibernate和行级ACL进行分页

我正在阅读关于Spring Security的内容,并想知道是否可以将Spring ACL与hibernate和分页一起使用.生成的SQL肯定是可怕的,但可以自动生成.如果数据库支持递归查询评估,甚至可以使用分层ACL.

使用后置过滤器不是解决方案,因为它破坏了分页,与数据库内的ACL过滤相比,这是一种不必要的开销.

所以我实际上已经有了建立解决方案的部分.我想知道是否有人已经这样做了.

链接:

pagination hibernate spring-security recursive-query spring-security-acl

5
推荐指数
1
解决办法
1271
查看次数

在PostgreSQL中使用REC里面的WITH

在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)

sql postgresql recursive-query common-table-expression

5
推荐指数
1
解决办法
1375
查看次数

SQL数据库设计,递归父子关系?

我想在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.

这是表示这样的关系的正确方法吗?在我的设计(性能,查询......)中还应该考虑其他事项吗?

mysql sql recursive-query hierarchical-data

5
推荐指数
1
解决办法
2830
查看次数

如何在postgresql中使用递归查询连接字段值?

我在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'只为该特定行设置结果.但是我的初始表的每一行都需要一个连接的地址.如何才能做到这一点?

sql postgresql recursion concatenation recursive-query

5
推荐指数
1
解决办法
4059
查看次数

如何解释sql with-recursive语句?

我想请教一些关于理解"递归"如何工作的帮助.更确切地说,为什么锚查询(非递归项)不会复制到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)

我的代码演练(我使用下面的链接):

  1. 评估非递归术语.对于UNION [...].

    在递归查询的结果中包括所有剩余的行,并将它们放在临时工作表中.

  2. 只要工作表不为空,请重复以下步骤:

    • 评估递归项,用工作表的当前内容替换递归自引用.对于UNION [...].在递归查询的结果中包括所有剩余行,并将它们放在临时中间表中.

    • 用中间表的内容替换工作表的内容,然后清空中间表."

LVL 0:

  1. 非递归部分

    • CTE:(N)1
    • 工作表:(N)1
  2. 递归部分

    • CTE:(N)1
    • 工作表:(N)1
    • 中间表(N)2

(这是我想的那部分) - 取代WORKING TABLE

因此递归t将使用WORKING TABLE来执行SELECT n + 1并将结果放在INTERMEDIATE TABLE中.

  1. UNION ALL

    • CTE:(N)1 2
    • 工作表:(N)2
    • 中间表:清洁
  2. 然后我们通过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

5
推荐指数
1
解决办法
559
查看次数

MySQL递归查询找到最短路径

我有一个问题,就是无法理解...

我有一张桌子,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不支持

有谁能指出我正确的方向。感谢您能获得的所有帮助。谢谢。

mysql dijkstra recursive-query

5
推荐指数
1
解决办法
791
查看次数

将CTE应用于递归查询

我正在尝试应用CTE和递归查询.数据库是MariaDB 10.2或更高版本.

业务规则如下:

  1. 账户可以是持股或投资组合.
  2. 控股包含一定数量的资金.
  3. 控股可以是活跃的和不活跃的.
  4. 投资组合包含零个或多个账户,这些账户可以属于多个投资组合.
  5. 在确定投资组合的价值时,每个账户的总价值乘以"权重"因子.

我的架构如下(注释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

5
推荐指数
1
解决办法
300
查看次数

使用sqlite在零件中拆分值

我正在努力转换

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)

sqlite recursive-query common-table-expression

5
推荐指数
1
解决办法
1030
查看次数