标签: common-table-expression

在C#中模拟CTE递归

假设有以下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)

c# sql recursion common-table-expression entity-framework-4

10
推荐指数
2
解决办法
3229
查看次数

CTE如何真正起作用?

我遇到了这个用于连接行元素的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)

sql-server recursive-query common-table-expression

10
推荐指数
2
解决办法
4292
查看次数

与多父母的父子关系的CTE

我有一个父子关系表,如下所示.我想像所有祖先和父母一样检索父或子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

sql t-sql sql-server-2005 graph common-table-expression

10
推荐指数
1
解决办法
2084
查看次数

将带有cte查询的结果插入临时表

我想将此查询的结果存储到临时表中:

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)

提前致谢.

sql-server common-table-expression

10
推荐指数
1
解决办法
2万
查看次数

递归SQL CTE和自定义排序顺序

您正在为线程化讨论板创建数据库架构的映像.有没有一种有效的方法为给定的线程选择正确排序的列表?我写的代码有效,但不按照我想要的方式排序.

假设你有这些数据:

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)

sql t-sql linq recursion common-table-expression

9
推荐指数
2
解决办法
4493
查看次数

用于传递闭包的递归查询

我创建了一个简单的例子来说明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

9
推荐指数
1
解决办法
4788
查看次数

通过SQL Server中的递归CTE创建排列?

看着 :

;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笛卡尔积的功效,并消除了相等的值.

http://i.imgur.com/uJUPtVH.png

好.

但是有可能增强这种递归伪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

9
推荐指数
1
解决办法
430
查看次数

在单独的CTE中调用具有不同参数的多语句TVF,显示错误的结果

我试图在同一个查询中使用不同的参数两次调用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

9
推荐指数
1
解决办法
171
查看次数

PostgreSQL中的层次和

这是我在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)

sql postgresql common-table-expression

8
推荐指数
1
解决办法
3065
查看次数

使用多个CTE

无法弄清楚如何使用多个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()分区的连接
我刚刚使用派生表

t-sql sql-server common-table-expression

8
推荐指数
1
解决办法
2万
查看次数