我如何编写这样的查询:
with t1 as
(
select id
from table1
),
RECURSIVE t2(
select * from t2
union
...
)
Run Code Online (Sandbox Code Playgroud)
目前不允许?
所以我有一个SQL查询来检索邻接列表中给定节点的所有子节点.
WITH RECURSIVE
q AS
(
SELECT id, name
FROM categories h
WHERE id = 11846801
UNION ALL
SELECT hc.id, hc.name
FROM q
JOIN categories hc
ON hc.parent = q.id
)
SELECT name
FROM q
Run Code Online (Sandbox Code Playgroud)
有没有修改该查询返回我的方式只是节点的最底层?我不能只指定给定的级别,因为每条路径可能有不同的深度.
假设有如下模式:
CREATE TABLE node (
id SERIAL PRIMARY KEY,
name VARCHAR,
parentid INT REFERENCES node(id)
);
Run Code Online (Sandbox Code Playgroud)
此外,我们假设存在以下数据:
INSERT INTO node (name,parentid) VALUES
('A',NULL),
('B',1),
('C',1);
Run Code Online (Sandbox Code Playgroud)
有没有办法防止创建周期?例:
UPDATE node SET parentid = 2 WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)
这将创造一个循环 1->2->1->...
我有一张桌子MODELS,有几个ITEMS可以属于。该ITEMS表是一个分层表,PARENT列上有一个自联接。根级别的项目将Null在PARENT. 项目可以深入任何级别。
create table MODELS (
MODELID int identity,
MODELNAME nvarchar(200) not null,
constraint PK_MODELS primary key (MODELID)
)
go
create table ITEMS (
ITEMID int identity,
MODELID int not null,
PARENT int null,
ITEMNUM nvarchar(20) not null,
constraint PK_ITEMS primary key (ITEMID)
)
go
alter table ITEMS
add constraint FK_ITEMS_MODEL foreign key (MODELID)
references MODELS (MODELID)
go
alter table ITEMS
add constraint FK_ITEMS_ITEMS foreign key (PARENT)
references …Run Code Online (Sandbox Code Playgroud) sql sql-server stored-procedures recursive-query sql-server-2008
我有一个关于使用递归SQL的问题,其中我有以下表结构
产品可以分为多组(为了清楚起见,我不使用int)
CREATE TABLE ProductGroups(ProductName nvarchar(50), GroupName nvarchar(50))
INSERT INTO ProductGroups(ProductName, GroupName) values
('Product 1', 'Group 1'),
('Product 1', 'Group 2'),
('Product 2', 'Group 1'),
('Product 2', 'Group 6'),
('Product 3', 'Group 7'),
('Product 3', 'Group 8'),
('Product 4', 'Group 6')
+-----------+---------+
| Product | Group |
+-----------+---------+
| Product 1 | Group 1 |
| Product 1 | Group 2 |
| Product 2 | Group 1 |
| Product 2 | Group 6 |
| Product 3 | …Run Code Online (Sandbox Code Playgroud) SELECT TOP ...在Postgres 中描述查询的大多数资源都说你应该使用LIMIT,ORDER BY如果需要通过某种顺序选择顶部元素,可能使用子句.
你会怎么做,如果你需要选择一个递归查询,那里是没有排序的前N个元素和有可能的查询可以在不递归返回N多行少(这样TOP的部分是必要的,以确保结果set 至少是 N行,而LIMIT可以允许更少的行)?
我的具体用例是动态SQL模式的修改,用于选择表的随机子样本.
这是我修改的sql源的链接.最简单的方法是查看那里定义的最终函数_random_select.它紧跟上述链接,但在输入表和输出结果集中已经被修改为多态,并且正确地说明了只返回输入表中已经存在的列的需要(还有另一个动态SQL)黑客row_number从最终结果集中排除中期结果).
这是一个眼睛,但它是我最接近可重复的例子.如果您使用_random_select并尝试从大于4500行的表中获取大约4500行的内容,则会开始以较高的概率看到较小的结果集,并且只会随着您增加所需样本的大小而变得更糟(因为重复的出现随着你想要的样本变大,情况会变得更糟)
请注意,在我的修改中,我没有使用_gaps此链接中的技巧,如果某个索引列中存在间隙,则意味着过度采样以抵消采样效率低下.那部分与这个问题无关,在我的情况下,我row_number用来确保有一个整数列,没有可能的间隙.
CTE的是递归的,以确保如果CTE的第一,非递归部分不给你足够的行(因为被去除重复的UNION),那么它会回去经过一轮又一轮的CTE的递归调用,并继续坚持更多的结果,直到你有足够的.
在链接的示例中,LIMIT使用,但我发现这不起作用.该方法返回的结果较少,因为最多LIMIT只能保证N行.
你如何获得至少 N行保证?选择TOPN行似乎是执行此操作的自然方式(因此递归CTE必须保持一直持续直到它获得足够的行来满足TOP条件),但这在Postgres中不可用.
sql postgresql recursive-query common-table-expression sql-limit
我正在尝试编写一个查询,以生成给定根的树中所有节点的列表,以及路径(使用父级给他们孩子的名称)到达那里的路径.我工作的递归CTE是直接来自这里的文档的教科书CTE ,然而,事实证明在这种情况下使路径工作很困难.
在git模型之后,由于遍历树创建的路径,父母会将名称提供给子级.这意味着映射到git的树结构等子id.
我一直在网上寻找递归查询的解决方案,但它们似乎都包含使用父ID或物化路径的解决方案,这些都会破坏Rich Hickey的数据库作为价值谈话的结构共享概念.
想象一下,对象表很简单(为简单起见,我们假设整数id):
drop table if exists objects;
create table objects (
id INT,
data jsonb
);
-- A
-- / \
-- B C
-- / \ \
-- D E F
INSERT INTO objects (id, data) VALUES
(1, '{"content": "data for f"}'), -- F
(2, '{"content": "data for e"}'), -- E
(3, '{"content": "data for d"}'), -- D
(4, '{"nodes":{"f":{"id":1}}}'), -- C
(5, '{"nodes":{"d":{"id":2}, "e":{"id":3}}}'), -- B
(6, …Run Code Online (Sandbox Code Playgroud) 我正在研究一个辅助项目,为了在自引用表中删除一行及其所有后代,我在触发器中使用这样的递归CTE:
CREATE TRIGGER dbo.tr_Comment_Delete
ON dbo.Comment INSTEAD OF DELETE
AS
;WITH IDs AS (
SELECT id FROM DELETED
UNION ALL
SELECT c.id
FROM Comment AS c INNER JOIN IDs AS i
ON c.parent_comment_id = i.id
)
DELETE FROM Comment
WHERE id IN (SELECT id FROM IDs);
GO
Run Code Online (Sandbox Code Playgroud)
这是自引用表
虽然我有这个代码按预期工作,但这是你做某事的情况之一,但你不太确定它是如何工作的.
更确切地说,我想知道的是,通过使用这种递归CTE(ID),当我尝试删除具有子注释的注释时,我能够避免引用完整性错误吗?
删除评论的过程/顺序是什么?
以此评论层次为例:
3-> 8-> 13
Run Code Online (Sandbox Code Playgroud)
这里,id 3的注释是根注释.评论8是对评论3的回复,就像评论13是对评论8的回复一样.
删除过程实际上是如何进行的?
PS我尝试添加一个表格,我在计算时插入了ID.不幸的是我无法理解它.这些是这样的表的结果:
id ins-date
3 2017-09-12 11:48:38.037
8 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
8 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
Run Code Online (Sandbox Code Playgroud) 我有以下 SQLAlchemy 表:
\n\n\n\nfrom sqlalchemy.ext.declarative import declarative_base\n\nBase = declarative_base()\n\nclass NetworkLink(Base):\n """Network immediate link between a franchisee and his franchisor\n\n """\n __tablename__ = \'network_link\'\n\n id_franchisee = Column(Integer, ForeignKey(\'user.id\'), primary_key=True)\n id_franchisor = Column(Integer, ForeignKey(\'user.id\'))\nRun Code Online (Sandbox Code Playgroud)\n\n它基本上代表了一个树状的网络结构。
\n\n给定特许人的 id,我需要获取整个子树中所有后代的 id。\n例如,如果表如下:
\n\nid_franchisor | id_franchisee \n1 | 2\n1 | 3\n2 | 4\n2 | 5\n4 | 6\nRun Code Online (Sandbox Code Playgroud)\n\n然后给定 id 1 我需要 1,2,3,4,5,6,而给定 2 我需要 2,4,5,6。
\n\n我知道这不是解决此问题的最有效的表表示形式,但此操作将很少执行,并且插入将更加常见。
\n\n我正在尝试使用递归查询来实现此功能,如下所示:
\n\n"""\nWITH RECURSIVE recursive_franchisee(id) AS\n(\n SELECT %s\n UNION ALL\n SELECT L.id_franchisee\n FROM recursive_franchisee …Run Code Online (Sandbox Code Playgroud) 我有一个带有父/子层次结构的表,支持多个(理论上无限)级别的嵌套:
|------|-------------------|-------------|
| id | title | parent_id |
|------|-------------------|-------------|
| 1 | Dashboard | 0 |
| 2 | Content | 0 |
| 3 | Modules | 0 |
| 17 | User Modules | 3 |
| 31 | Categories | 17 |
| ... | | |
|------|-------------------|-------------|
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建一个查询,生成每个项目的父项的串联列表,直到树中的最高父项:
|------|----------------------|
| id | concatenatedParents |
|------|----------------------|
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
| 17 | 3,0 | …Run Code Online (Sandbox Code Playgroud) mysql sql recursive-query common-table-expression hierarchical-data
recursive-query ×10
postgresql ×5
sql ×5
sql-server ×3
triggers ×2
mysql ×1
plpgsql ×1
python ×1
sql-cte ×1
sql-limit ×1
sqlalchemy ×1