假设有以下CTE返回我拥有的某些树数据(邻接模型)的级别(取自Linq中的分层数据 - 选项和性能):
WITH hierarchy_cte(id, parent_id, data, lvl) AS
(
SELECT id, parent_id, data, 0 AS lvl
FROM dbo.hierarchical_table
WHERE (parent_id IS NULL)
UNION ALL
SELECT t1.id, t1.parent_id, t1.data, h.lvl + 1 AS lvl
FROM dbo.hierarchical_table AS t1
INNER JOIN hierarchy_cte AS h ON t1.parent_id = h.id
)
SELECT id, parent_id, data, lvl
FROM hierarchy_cte AS result
Run Code Online (Sandbox Code Playgroud)
我想知道通过在C#而不是SQL中进行递归是否会有任何性能提升.任何人都可以告诉我如何使用递归C#函数执行CTE所做的相同工作,假设我有一个IQueryable,其中Tree是一个表示分层表中条目的实体?有点像:
public void RecurseTree(IQueryable<Tree> tree, Guid userId, Guid parentId, int level)
{
...
currentNode.level = x
...
Recurse(tree... ,level + 1) …Run Code Online (Sandbox Code Playgroud) 我遇到了这个用于连接行元素的CTE解决方案,我认为它很棒,我意识到CTE有多强大.
但是,为了有效地使用这样的工具,我需要知道它如何在内部工作以构建心理图像,这对于像我这样的初学者来说在不同场景中使用它是必不可少的.
所以我试着慢动作上面代码片段的过程,这里是代码
USE [NORTHWIND]
GO
/****** Object: Table [dbo].[Products2] Script Date: 10/18/2011 08:55:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('Products2','U') IS NOT NULL DROP TABLE [Products2]
CREATE TABLE [dbo].[Products2](
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[ProductName] [nvarchar](40) NOT NULL,
[SupplierID] [int] NULL,
[CategoryID] [int] NULL,
[QuantityPerUnit] [nvarchar](20) NULL,
[UnitPrice] [money] NULL,
[UnitsInStock] [smallint] NULL,
[UnitsOnOrder] [smallint] NULL,
[ReorderLevel] [smallint] NULL,
[Discontinued] [bit] NOT NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Products2] ON
INSERT [dbo].[Products2] …Run Code Online (Sandbox Code Playgroud) 我有一个父子关系表,如下所示.我想像所有祖先和父母一样检索父或子ID的所有记录,如果可能的话,还要检查深度.例如,我想找到D的族,它将返回前14行,因为它们都属于同一族.可能有几套这样的家庭.我想与一个成员查询,并希望获得全家记录.是否可以使用CTE实现这一点?根据表记录的家庭结构:
A
/ \
B C G J
/ \ / \ / \
M D E H K
/ \ / \ / \
N F I L
R
|
S U
\ /
T
Run Code Online (Sandbox Code Playgroud)
请帮忙.表格如下:
Parent Child
------ ------
A B
A C
B D
D F
M F
M N
C E
G E
G H
J H
J K
H I
K I
K L
R S
S T
U T
Run Code Online (Sandbox Code Playgroud)
谢谢,
Himadri
我想将此查询的结果存储到临时表中:
WITH cOldest AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY [MyKey] ORDER BY SomeColumn DESC) AS rnDOB
FROM MyTable
)
SELECT
C.*
*** Insert into #MyTempTable *** This part doesn't work
FROM
cOldest C
WHERE
C.rnDOB = 1
Run Code Online (Sandbox Code Playgroud)
提前致谢.
您正在为线程化讨论板创建数据库架构的映像.有没有一种有效的方法为给定的线程选择正确排序的列表?我写的代码有效,但不按照我想要的方式排序.
假设你有这些数据:
ID | ParentID ----------------- 1 | null 2 | 1 3 | 2 4 | 1 5 | 3
所以结构应该是这样的:
1 |- 2 | |- 3 | | |- 5 |- 4
理想的情况是,在代码中,我们想要的结果集出现在以下顺序:1,2,3,5,4
问题:随着CTE我写的实际上是被返回为:1,2,4,3,5
我知道使用LINQ可以很容易地进行分组/排序,但我不愿意在内存中这样做.这似乎是目前最好的解决方案......
这是我目前正在使用的CTE:
with Replies as (
select c.CommentID, c.ParentCommentID 1 as Level
from Comment c
where ParentCommentID is null and CommentID = @ParentCommentID
union all
select c.CommentID, c.ParentCommentID, r.Level + 1 as Level
from Comment c
inner join Replies r on …Run Code Online (Sandbox Code Playgroud) 我创建了一个简单的例子来说明PostgreSQL中使用递归查询的传递闭包.
但是,我的递归查询有些问题.我不熟悉语法,所以这个请求可能完全是我的noobish,为此我提前道歉.如果运行查询,您将看到节点1在路径结果中重复自身.有人可以帮我弄清楚如何调整SQL吗?
/* 1
/ \
2 3
/ \ /
4 5 6
/
7
/ \
8 9
*/
create table account(
acct_id INT,
parent_id INT REFERENCES account(acct_id),
acct_name VARCHAR(100),
PRIMARY KEY(acct_id)
);
insert into account (acct_id, parent_id, acct_name) values (1,1,'account 1');
insert into account (acct_id, parent_id, acct_name) values (2,1,'account 2');
insert into account (acct_id, parent_id, acct_name) values (3,1,'account 3');
insert into account (acct_id, parent_id, acct_name) values (4,2,'account 4');
insert into account (acct_id, parent_id, acct_name) values (5,2,'account 5'); …Run Code Online (Sandbox Code Playgroud) sql postgresql recursive-query common-table-expression transitive-closure-table
看着 :
;WITH cte AS(
SELECT 1 AS x UNION
SELECT 2 AS x UNION
SELECT 3 AS x
)
Run Code Online (Sandbox Code Playgroud)
我可以为所有3个值创建排列表:
SELECT T1.x , y=T2.x , z=t3.x
FROM cte T1
JOIN cte T2
ON T1.x != T2.x
JOIN cte T3
ON T2.x != T3.x AND T1.x != T3.x
Run Code Online (Sandbox Code Playgroud)
这使用了SQL笛卡尔积的功效,并消除了相等的值.

好.
但是有可能增强这种递归伪CTE:
;WITH cte AS(
SELECT 1 AS x , 2 AS y , 3 AS z
UNION ALL
...
)
SELECT * FROM cte
Run Code Online (Sandbox Code Playgroud)

因此它将产生与以下相同的结果:

注意,在SO中有其他使用递归CTE的解决方案,但它没有传播到列,而是排列的字符串表示
sql-server recursion common-table-expression sql-server-2008-r2
我试图在同一个查询中使用不同的参数两次调用TVF,但由于某种原因,当我将结果加在一起时,其中一个结果掩盖了另一个.我把问题简化为这个小例子:
拿这个内联TVF:
CREATE FUNCTION dbo.fnTestErrorInline(@Test INT)
RETURNS TABLE
AS
RETURN
(
SELECT ID, Val
FROM (VALUES
(1, 1, 10),
(1, 2, 20),
(1, 3, 30),
(1, 4, 40),
(2, 1, 50),
(2, 2, 60),
(2, 3, 70),
(2, 4, 80)
) t(Test, ID, Val)
WHERE t.Test=@Test
)
Run Code Online (Sandbox Code Playgroud)
和等效的多线函数:
CREATE FUNCTION dbo.fnTestErrorMultiline(@Test INT)
RETURNS @tbl TABLE (
ID INT NOT NULL,
Val INT NOT NULL
)
AS
BEGIN
IF @Test=1
INSERT INTO @tbl (ID, Val) VALUES
(1, 10),
(2, 20),
(3, …Run Code Online (Sandbox Code Playgroud) sql sql-server user-defined-functions common-table-expression
这是我在PostgreSQL中遇到的问题的简化版本.
我有下表A:
[ID INTEGER | VALUE NUMERIC(10,2) | 家长 整数 ]
其中'PARENT'是列引用ID的自引用FK.
表定义是:
CREATE TABLE A(ID INTEGER IDENTITY, VALUE NUMERIC(10,2), PARENT INTEGER)
ALTER TABLE A ADD CONSTRAINT FK FOREIGN KEY (PARENT) REFERENCES A(ID)
Run Code Online (Sandbox Code Playgroud)
这个简单的表允许定义任意深度的树数据结构.现在我需要编写一个SQL(我不想使用服务器端PL-SQL)来报告每个节点,子树的总值"悬挂"在它下面.例如,使用下表:
| ID | VALUE | PARENT |
-------------------------
| 1 | NULL | NULL |
| 2 | 3.50 | 1 |
| 3 | NULL | NULL |
| 4 | NULL | 3 |
| 5 | 1.50 | 4 |
| …Run Code Online (Sandbox Code Playgroud) 无法弄清楚如何使用多个CTE
这失败了
; with [cteOne] as (
select 1 as col
),
[cteTwo] as (
select 2 as col
)
select 'yesA' where exists (select * from [cteOne])
select 'yexB' where exists (select * from [cteTwo])
Run Code Online (Sandbox Code Playgroud)
这有效 - 但这不是我需要的
; with [cteOne] as (
select 1 as col
),
[cteTwo] as (
select 2 as col
)
select * from [cteOne]
union
select * from [cteTwo]
Run Code Online (Sandbox Code Playgroud)
真正的语法是row_number()分区的连接
我刚刚使用派生表