我试图基于它们之间的外键构建表的依赖图.此图需要以任意表名作为其根开始.我可以,给定一个表名查找使用all_constraints视图引用它的表,然后查找引用它们的表,依此类推,但这将是非常低效的.我写了一个递归查询,为所有表执行此操作,但是当我添加时:
START WITH Table_Name=:tablename
Run Code Online (Sandbox Code Playgroud)
它不会返回整个树.
我有一个想法,我可以编写一个查询来查找根表的所有后代表,基于外键.
查询看起来像这样:
select level, lpad(' ', 2 * (level - 1)) || uc.table_name as "TABLE", uc.constraint_name, uc.r_constraint_name
from all_constraints uc
where uc.constraint_type in ('R', 'P')
start with uc.table_name = 'ROOT_TAB'
connect by nocycle prior uc.constraint_name = uc.r_constraint_name
order by level asc;
Run Code Online (Sandbox Code Playgroud)
结果我看起来像这样:
1 ROOT_TAB XPKROOTTAB
1 ROOT_TAB R_20 XPKPART_TAB
2 CHILD_TAB_1 R_40 XPKROOTTAB
2 CHILD_TAB_2 R_115 XPKROOTTAB
2 CHILD_TAB_3 R_50 XPKROOTTAB
这个结果是所有的子表ROOT_TAB,但查询不改乘的孩子CHILD_TAB_1,CHILD_TAB_2或CHILD_TAB_3.
递归查询对我来说是新的,所以我猜我在connect by条款中遗漏了一些东西,但我在这里画了一个空白.实际上是否可以ROOT_TAB在单个查询中获得完整的层次结构,或者我最好在递归过程中包装查询?
我有一张如下表:
MyTable
--------
A
B
C
Run Code Online (Sandbox Code Playgroud)
A,B,C 是列,MyTable 是表名,我想运行一个 mysql 查询,如:
SELECT MT1.A, MT2.A, MT2.B FROM MyTable MT1, MyTable MT2
WHERE MT1.B<>MT2.B and MT2.B like "MT1.B%" and MT2.status=0;
Run Code Online (Sandbox Code Playgroud)
正如您从上面的查询中看到的,我有一个表,我想找到以另一个行值开头并与条件匹配的列。但是上面的查询显然失败了,因为 mysql 将“MT1.B%”作为字符串,我如何用 Mysql 实现这一点?
假设在SQL中实现树结构,如下所示:
CREATE TABLE nodes (
id INTEGER PRIMARY KEY,
parent INTEGER -- references nodes(id)
);
Run Code Online (Sandbox Code Playgroud)
尽管可以在此表示中创建循环,但我们假设我们永远不会让这种情况发生.该表只存储一个根集合(父节点为null的记录)及其后代.
目标是,给定表中节点的id,找到作为其后代的所有节点.
阿是的后代乙如果任一个的父是乙或甲的父是的后代乙.注意递归定义.
以下是一些示例数据:
INSERT INTO nodes VALUES (1, NULL);
INSERT INTO nodes VALUES (2, 1);
INSERT INTO nodes VALUES (3, 2);
INSERT INTO nodes VALUES (4, 3);
INSERT INTO nodes VALUES (5, 3);
INSERT INTO nodes VALUES (6, 2);
Run Code Online (Sandbox Code Playgroud)
代表:
1
`-- 2
|-- 3
| |-- 4
| `-- 5
|
`-- …Run Code Online (Sandbox Code Playgroud) 我需要编写一个多次调用递归查询的查询.
我无法弄清楚该怎么做.我想我可以通过使用游标,在运行时准备sql语句然后使用EXEC(mySQLstatement)在每个游标FETCH NEXT运行它来做到这一点.
无论如何,这不是好方法.
这是问题(当然这里是简化的,我只留下必要的列来表达自己):我有一个客户树(层次结构),并且每个客户都定义了一些联系人.
CUSTOMERS表包含ID_CUSTOMER字段和ID_PARENT_CUSTOMER字段,CUSTOMER_CONTACTS表包含ID_CUSTOMER字段和ID_CONTACT字段.
通过此查询(它可以工作),我可以获得客户308的所有联系人以及其子客户的所有联系人:
with [CTE] as (
select ID_CUSTOMER from CUSTOMERS c where c.ID_CUSTOMER = 308
union all
select c.ID_CUSTOMER from [CTE] p, CUSTOMERS c
where c.ID_PARENT_CUSTOMER = p.ID_CUSTOMER
)
select ID_CUSTOMER into #Customer308AndSubCustomers from [CTE]
select 308 as ParentCustomer, ID_CUSTOMER, ID_CONTACT, from CUSTOMER_CONTACTS
WHERE ID_CUSTOMER IN (select * from #Customer308AndSubCustomers)
drop table #Customer308AndSubCustomers
Run Code Online (Sandbox Code Playgroud)
但是我想在所有客户的单个查询中都有相同的信息,而不仅仅是308.所以这就是为什么我建议使用游标,这样我就可以重用上面的语句而只使用变量而不是308.
但你能建议更好的查询吗?
我正在练习prolog和所有这一切都在杀我.试着这样做:
twice([1,2,3],X).
Run Code Online (Sandbox Code Playgroud)
我想要的输出是
X = [1,1,2,2,3,3].
Run Code Online (Sandbox Code Playgroud)
这是我最近的尝试:
twice([HD|TL],[HD2|TL2]):-
twice(TL,[HD,HD2|TL2]).
twice([],[HD|TL]).
Run Code Online (Sandbox Code Playgroud)
//新
twice([],[]).
twice([A|B],Out):- twice([A|B],[A,A|Rest],
twice(B,Rest).
Run Code Online (Sandbox Code Playgroud) 我需要查询的帮助,让我们说这是表中的数据.
timestamp
-------------------
2010-11-16 10:30:00
2010-11-16 10:37:00
2010-11-16 10:40:00
2010-11-16 10:45:00
2010-11-16 10:48:00
2010-11-16 10:55:00
2010-11-16 10:56:00
Run Code Online (Sandbox Code Playgroud)
我希望每个第一行(时间戳)比最后一行至少晚5分钟.在这种情况下,查询应返回:
timestamp
-------------------
2010-11-16 10:30:00
2010-11-16 10:37:00
2010-11-16 10:45:00
2010-11-16 10:55:00
Run Code Online (Sandbox Code Playgroud) sql postgresql plpgsql recursive-query common-table-expression
我在尝试以递归方式遍历层次结构以查找可能具有多个顶级节点的组织结构中的所有后代节点的顶级节点时遇到问题.我试图使用SQL Server 2012 CTE这样做,但它不会递归到达每个分支的最顶级节点.我已经尝试过完全按照与此相关的其他帖子中显示我的查询,但仍然没有骰子.(至少我想我是.)我希望有人可以告诉我这里我做错了什么?这篇文章与我正在尝试做的事情密切相关,我已经按照接受的答案,但我仍然只是"得到它":在SQL中找到顶级父级

如上所示,我有OrgGroups引用直接父组,除非它是顶级然后它是NULL.例如,(4)财务(顶级) - >(5)人力资源 - >(11)福利
我想创建一个数据库视图,列出每个OrgGroup以及他们的TOP-MOST祖先的ID.(不是他们的直接父母)
因此,例如,DB View将拥有(11)Benefits OrgGroup的记录,以及(4)Finance的最顶层parentgroupId的相应列值.
;WITH OrgStructureIndex AS
(
SELECT O.OrgGroupId, O.Name, O.OrgStructureId, O.ParentGroupId, 1 AS Lvl
FROM OrgGroups O
UNION ALL
SELECT OG.OrgGroupId, OG.Name, OG.OrgStructureId, OG.ParentGroupId, Lvl+1 AS Lvl
FROM OrgGroups OG INNER JOIN OrgStructureIndex OI
ON OI.OrgGroupId = OG.ParentGroupId
)
SELECT * FROM OrgStructureIndex
Run Code Online (Sandbox Code Playgroud)
这导致福利组织组具有最高的ParentGroupId(5)HR.期望的结果将是(4)财务.它还会导致重复记录.

至少要删除重复项,我已将SQL更改为:
;WITH OrgStructureIndex AS
(
SELECT O.OrgGroupId, O.Name, O.OrgStructureId, O.ParentGroupId, 1 AS Lvl
FROM OrgGroups O
UNION ALL …Run Code Online (Sandbox Code Playgroud) sql-server recursive-query common-table-expression hierarchical-data
我有一个带有主键id和外键的自引用表parent_id。
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PK | NULL | IDENTITY |
| parent_id | int(11) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
我有一个如下表(减少数据以便更清楚)
表 MySiteMap
Id Name parent_id
1 A NULL
2 B 1
3 C 1
4 D 1
20 B1 2
21 B2 2 …Run Code Online (Sandbox Code Playgroud) 我有一个表 ServiceItem,其中包含 Id、ParentId 和一些属性,例如名称、描述等。层次结构的最大级别为 2。我需要一个查询来选择具有某些条件的行,例如Name = '123'及其父行,以获得如下结果:
Id ParentId Name
1 NULL '12'
2 1 '123'
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这个:
SELECT
*
FROM ServiceItem si
WHERE si.Name = '123'
OR EXISTS (
SELECT
*
FROM ServiceItem syst
JOIN ServiceItem si2
ON si2.ParentId = syst.Id
WHERE syst.Id = si.ParentId
AND si2.Name = '123'
)
Run Code Online (Sandbox Code Playgroud)
但它返回父级及其所有子级。有没有机会通过一个查询来完成它?我正在使用 T-SQL 来做到这一点。
它与这个问题不同,因为我需要获取一堆行,不仅是路径 ID,而且查询中的条件可能不同。
recursive-query ×10
sql ×5
sql-server ×4
recursion ×3
oracle ×2
t-sql ×2
list ×1
mysql ×1
oracle10g ×1
plpgsql ×1
postgresql ×1
prolog ×1
sqlite ×1