标签: common-table-expression

获取树层次结构的CTE递归

我需要以特定的方式获得树的有序层次结构.有问题的表看起来有点像这样(所有ID字段都是uniqueidentifiers,为了示例,我简化了数据):

EstimateItemID    EstimateID    ParentEstimateItemID     ItemType
--------------    ----------    --------------------     --------
       1              A                NULL              product
       2              A                  1               product
       3              A                  2               service
       4              A                NULL              product
       5              A                  4               product
       6              A                  5               service
       7              A                  1               service
       8              A                  4               product

树形结构的图形视图(*表示"服务"):

           A
       ___/ \___
      /         \
    1            4
   / \          / \
  2   7*       5   8
 /            /
3*           6*

使用此查询,我可以获得层次结构(只是假装'A'是一个唯一标识符,我知道它不在现实生活中):

DECLARE @EstimateID uniqueidentifier
SELECT @EstimateID = 'A'

;WITH temp as(
    SELECT * FROM EstimateItem
    WHERE EstimateID = @EstimateID …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression

45
推荐指数
2
解决办法
7万
查看次数

单个查询中的多个CTE

是否可以在单个查询中组合多个CTE arel?我正在寻找获得这样结果的方法:

WITH 'cte1' AS (
...
),
WITH RECURSIVE 'cte2' AS (
...
),
WITH 'cte3' AS (
...
)
SELECT ... FROM 'cte3' WHERE ...
Run Code Online (Sandbox Code Playgroud)

如你所见,我有一个递归CTE和两个非递归.

sql postgresql recursive-query common-table-expression arel

38
推荐指数
3
解决办法
3万
查看次数

如何在Table-Valued-Function中为CTE设置maxrecursion选项

我面临一个问题,即在TVF内声明CTE的maxrecursion选项

这是CTE(一个简单的日历):

DECLARE @DEBUT DATE = '1/1/11',   @FIN DATE = '1/10/11';

WITH CTE as(       
SELECT @debut as jour       
UNION ALL       
SELECT DATEADD(day, 1, jour)       
FROM   CTE      
WHERE  DATEADD(day, 1, jour) <= @fin)
SELECT jour FROM CTE option (maxrecursion 365)
Run Code Online (Sandbox Code Playgroud)

和TVF:

 CREATE FUNCTION [liste_jour]  
 (@debut date,@fin date)
 RETURNS TABLE
 AS     
 RETURN      
 (  
  WITH CTE as(       
  SELECT @debut as jour       
  UNION  ALL       
  SELECT DATEADD(day, 1, jour)       
  FROM   CTE      
  WHERE  DATEADD(day, 1, jour) <= @fin)
  SELECT jour FROM CTE
  --option (maxrecursion 365)
 ) …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression

37
推荐指数
2
解决办法
4万
查看次数

将INDEX添加到CTE

应该是一个非常直截了当的问题.我可以将INDEX添加到公用表表达式(CTE)吗?

common-table-expression sql-server-2008

36
推荐指数
2
解决办法
4万
查看次数

关键字'with'... previous语句附近的语法不正确必须以分号结束

我使用的是SQL Server 2005.我的存储过程中有2个WITH子句

WITH SomeClause1 AS
(
  SELECT ....
)
WITH SomeClause2 AS
(
  SELECT ....
)
Run Code Online (Sandbox Code Playgroud)

但是错误发生了

关键字'with'附近的语法不正确.如果此语句是公用表表达式或xmlnamespaces子句,则必须以分号结束前一个语句.

我有什么选择?有什么分配器我不知道吗?

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

35
推荐指数
2
解决办法
6万
查看次数

如何在SQL Server中的表值函数中使用CTE语句

我已经了解到某些版本的Microsoft OLE DB Provider for SQL Server(主要在Windows XP上)不支持WITH语句.所以,我决定将我的SQL语句移动到表值函数中,并从我的应用程序中调用它.现在,我被困住了.我应该如何使用该INSERT INTO声明WITH?这是我到目前为止的代码,但SQL Server不喜欢它... :-(

CREATE FUNCTION GetDistributionTable 
(
    @IntID int,
    @TestID int,
    @DateFrom datetime,
    @DateTo datetime
)
RETURNS 
@Table_Var TABLE 
(
    [Count] int, 
    Result float
)
AS
BEGIN
INSERT INTO @Table_Var ([Count], Result) WITH T(Result)
     AS (SELECT ROUND(Result - AVG(Result) OVER(), 1)
         FROM RawResults WHERE IntID = @IntID AND DBTestID = @TestID AND Time >= @DateFrom AND Time <= @DateTo)
SELECT COUNT(*) AS [Count],
       Result
FROM   T …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression sql-server-2008-r2

35
推荐指数
2
解决办法
6万
查看次数

我们如何在sql server中的子查询中使用CTE?

我们如何在sql server中的子查询中使用CTE?

喜欢 ..

选择id(我想在这里使用CTE),来自table_name的名称

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

34
推荐指数
2
解决办法
4万
查看次数

linq-to-sql中的公用表表达式(CTE)?

是否可以在Linq to SQL中执行公用表表达式(CTE)(如下所示).我对CTE和Linq to SQL都很陌生.

我目前正在免费存储过程(但不能以任何方式对付它们)所以我不想仅仅针对一个查询进行存储过程的跳跃,除非它是完全必要的.

这是我在SQL中做的一个例子,我想知道我是否可以在Linq to SQL中做:

WITH TaskHierarchy (TaskID, [Subject], ParentID, HierarchyLevel, HierarchyPath) AS
(
   -- Base case
   SELECT
      TaskID,
      [Subject],
      ParentID,
      1 as HierarchyLevel,
      CONVERT(VARCHAR(MAX),'/') AS HierarchyPath
   FROM Task
   WHERE TaskID = 2

   UNION ALL

   -- Recursive step
   SELECT
      t.TaskID,
      t.Subject,
      t.ParentID,
      th.HierarchyLevel + 1 AS HierarchyLevel,
      CONVERT(varchar(MAX),th.HierarchyPath + CONVERT(VARCHAR(32),t.ParentID) + '/') AS HierarchyPath
   FROM Task t
      INNER JOIN TaskHierarchy th ON
         t.ParentID = th.TaskID
)

SELECT *
FROM TaskHierarchy
ORDER BY HierarchyLevel, [Subject]
Run Code Online (Sandbox Code Playgroud)

common-table-expression linq-to-sql

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

在SQL Server中结合CTE"WITH"和"WITH XMLNAMESPACES ...."

有没有人设法在SQL Server的T-SQL中创建一个CTE,其中还包含一个WITH XMLNAMESPACES声明?

似乎两个WITH关键词都坚持成为"T-SQL批处理中的第一个",而这并不能真正起作用....

我试过了:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
WITH CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery
Run Code Online (Sandbox Code Playgroud)

没用了:-((语法错误)

消息156,级别15,状态1,行2
关键字'WITH'附近的语法不正确.
消息319,级别15,状态1,行2
关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.

所以我尝试WITH用分号前面加第二个:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
;WITH CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery
Run Code Online (Sandbox Code Playgroud)

得到了这个:

消息102,级别15,状态1,行2
'''附近的语法不正确.

然后我尝试将其WITH XMLNAMESPACES放入CTE:

WITH CTEQuery AS
(
   WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
   SELECT (list of fields)
      FROM dbo.MyTable …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression

31
推荐指数
1
解决办法
3万
查看次数

如何重用公用表表达式

我正在使用公用表表达式进行分页:

with query as (
  Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
)
Select * from query where TableRowNum between 1 and 25 Order By TableRowNum ASC
Run Code Online (Sandbox Code Playgroud)

在进行此查询后,我立即进行几乎相同的查询以检索项目总数:

with query as (
  Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
)
Select Count(*) from query
Run Code Online (Sandbox Code Playgroud)

我尝试将这些组合在一起(即:定义CTE,查询数据然后查询Count,但是当我这样做时,我收到错误消息"无效对象名称'查询'"以响应第二个查询(计数).

有没有办法将这两个查询合并为一个,以保存到DB的往返?

sql sql-server common-table-expression

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