标签: common-table-expression

在SQL Server中对递归结果集进行排序

我在构造一个返回XML样式层次结构的查询时遇到了极大的困难.

我们有一个数据库表,其中包含我们网站的URL层次结构.该表包含列:ID,URL,DisplayName,ParentID,ItemOrder

父ID在当前项和它的父项之间形成递归关系.该项目应位于层次结构中它的父级下方,并且还应使用项目顺序对层次结构中同一级别的项目进行排序.

我设法得到一个递归查询工作,所以它按顺序向下钻取层次结构,但我也不能按项目顺序排序.

我目前的查询如下:

WITH Parents AS
(
SELECT MenuItemId, URL, ParentItemId, ItemOrder
FROM CambsMenu

UNION ALL

SELECT si.MenuItemId, si.URL, si.ParentItemId, si.ItemOrder
FROM CambsMenu si INNER JOIN Parents p
ON si.ParentItemId = p.MenuItemId
)

SELECT DISTINCT *
FROM Parents
Run Code Online (Sandbox Code Playgroud)

sql sql-server recursion common-table-expression

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

使用像while循环一样的递归公用表表达式

我有下表

   Log

 Date            date
 Description     varchar
 ID              integer
Run Code Online (Sandbox Code Playgroud)

给定日期作为参数,我必须找到否.或者每天从开始日期到使用递归cte后的一个月记录的日志数. 有些天可能没有任何日志,所以我必须将计数打印为0.

例如:

  select * from Log
Run Code Online (Sandbox Code Playgroud)

回报

  1   insert      2011-01-17
  2   blah blah   2011-01-23
  3   blah        2011-07-07
Run Code Online (Sandbox Code Playgroud)

对于2011-01-17作为输入,输出应该是

   2011-01-17    1
   2011-01-18    0
   2011-01-19    0
   ....
   2011-01-23    1
   .....
   2011-02-17    0
Run Code Online (Sandbox Code Playgroud)

我必须使用递归 cte来做那个.我不知道如何在每次递归中将日期递增1以及如何停止\终止递归.

这是我到目前为止所做的事情:

 with cte as    (
    select '2011-01-17' as dat,count(*) as count 
from log group by date 
having date='2011-01-17' 

union all 

select dateadd(day,1,dat) as dat,count(*) as count 
from log,cte 
group by date 
having date=dateadd(day,1,dat) 
where dat<'2011-02-17' …
Run Code Online (Sandbox Code Playgroud)

sql t-sql common-table-expression sql-server-2008 recursive-cte

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

CTE中的UNION ALL

我正在尝试让UNION ALL使用CTE进行分页.我需要从两个表中获取与一组条件匹配的所有记录,然后分页结果.第一张表的CTE如下所示:

;WITH Results_CTE AS (SELECT t1.SomeIntKey1, ROW_NUMBER() OVER (ORDER BY SomeIntKey1) AS RowNum  
 FROM Table1 t1
 LEFT JOIN CalculatedData d ON d.Key = t1.SomeIntKey1
 WHERE Postcode LIKE 'CHX 1XX%' 
 ) SELECT * FROM Results_CTE a INNER JOIN CalclatedData d ON a.SomeIntKey1 = d.Key WHERE RowNum >= 0 AND RowNum <= 10 OPTION(RECOMPILE) 
Run Code Online (Sandbox Code Playgroud)

第二个表的分页SQL(工作正常)是:

;WITH Results_CTE AS (SELECT t2.SomeIntKey2, ROW_NUMBER() OVER (ORDER BY SomeIntKey2) AS RowNum  
 FROM Table2 t2
 LEFT JOIN CalculatedData d ON d.Key = t1.SomeIntKey2
 WHERE Postcode LIKE …
Run Code Online (Sandbox Code Playgroud)

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

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

重用SQL Server公用表表达式的结果

我有一个查询,使用公用表表达式检索页面的所有模块和子模块.是否可以多次使用cte的结果?

WITH top_level_modules (
[AppContentModuleID]
,[SortIndex]
,[ContentHolderName]
,[OwnerType]
,[AppContentModuleGuid]
,[parent_AppContentModuleID]
,[ModuleID]
,[RenderIDTag]
,[WrapperType]
,[Level]
)
AS
( 
SELECT amcp.[AppContentModuleID]
    ,amcp.[SortIndex]
    ,amcp.[ContentHolderName]
    ,1
    ,amc.[AppContentModuleGuid]
    ,amc.[parent_AppContentModuleID]
    ,amc.[ModuleID]
    ,amc.[RenderIDTag]
    ,amc.[WrapperType]
    ,0 AS [Level]
FROM [dbo].[application_module_content_page] amcp
INNER JOIN [dbo].[application_module_content] amc on amcp.[AppContentModuleID] = amc.[AppContentModuleID]
WHERE amcp.[PageID] = @PageID
UNION
SELECT amcm.[AppContentModuleID]
    ,amcm.[SortIndex]
    ,amcm.[ContentHolderName]
    ,2
    ,amc.[AppContentModuleGuid]
    ,amc.[parent_AppContentModuleID]
    ,amc.[ModuleID]
    ,amc.[RenderIDTag]
    ,amc.[WrapperType]
    ,0
FROM [dbo].[application_module_content_masterpage] amcm
INNER JOIN [dbo].[application_module_content] amc on amcm.[AppContentModuleID] = amc.[AppContentModuleID]
WHERE amcm.[AppMasterPageID] = @MasterPageID
),
child_modules AS 
(
SELECT tlm.[AppContentModuleID]
    ,tlm.[SortIndex] …
Run Code Online (Sandbox Code Playgroud)

sql sql-server-2005 common-table-expression

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

CTE出乎意料的结果

我创建了一个使用多个CTE的复杂过程(主要用于递归分层工作).
在小样本数据集上,一切都按预期进行,但是当我将代码应用于大型数据集时,我收到了意外(和错误)的结果.

我想我已经把它缩小到了CTE.递归CTE是在几个早期CTE中处理的"馈送"数据,这似乎是问题所在.

我设置了一个示例数据集如下:

  • 四行具有唯一数据
  • 每行接收一个随机行号(这是在CTE中添加的

然后,我获取第一个CTE的结果,并在第二个CTE中执行自连接.
我期望所有行都加入,每个行都是自己的.实际发生的是不相等的行加入.

有人可以提供这种行为的解释吗?

sql common-table-expression sql-server-2008

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

WITH语句是每个查询执行一次还是每行执行一次?

我对WITH语句(CTE)的理解是每个查询执行一次.使用这样的查询:

WITH Query1 AS ( ... )
SELECT *
FROM
    SomeTable t1
    LEFT JOIN Query1 t2 ON ...
Run Code Online (Sandbox Code Playgroud)

如果这导致100行,我希望Query1它只执行一次 - 而不是100次.如果这个假设是正确的,运行整个查询所需的时间大致等于带到时间:跑Query1+选择SomeTable+加入SomeTableQuery1.

我处于以下情况:

  • Query1 单独运行需要约5秒(400k行).
  • 删除WITH语句后,查询的其余部分LEFT JOIN需要~15秒(400k行).

因此,当使用WITH语句和LEFT JOIN就地运行整个查询时,我会期望查询及时完成,而我让它运行超过一个小时,一旦停止它只能达到11k行.

我显然是错的,但为什么呢?

sql-server performance with-statement common-table-expression sql-server-2008

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

Oracle:使用带有更新子句的 CTE

我可以使用oracle数据库中的公用表表达式进行更新吗?

ORA-00928: missing SELECT keyword尝试此操作时出现错误:

with average as (SELECT avg(salary) FROM instructor)
update instructor
               set salary = case
                   when salary <= average then salary * 1.05 
                   else salary * 1.03                                     
               end
Run Code Online (Sandbox Code Playgroud)

sql oracle common-table-expression

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

PostgreSQL 中 WITH .. AS .. 子句的替代方案

我有以下类型的几个大查询(为了清楚起见简化了)。

create function myfunction()
  returns void
as $$
begin

...
with t as (
  total                 as total,
  total * 100 / total   as total_percent,
  total / people.count  as total_per_person,
  part1                 as part1,
  part1 * 100 / total   as part1_percent,
  part1 / people.count  as part1_per_person,
  part2                 as part2,
  part2 * 100 / total   as part2_percent,
  part2 / people.count  as part2_per_person,
  ...
  from (
    select
    total.amount as total
    part1.amount as part1
    part2.amount as part2
    ...
    people.amount as people
    from (select ...from mytable..) …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql common-table-expression postgresql-9.3

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

在CTE查询SQL服务器中解析错误

我编写了一个CTE查询,我在Microsoft SQL Server 2008 R2 Management Studio中执行查询:

WITH DependencyHierarchy(processName, dependProcessName) AS
(
    SELECT
       processName,
       dependProcessName,
       1 as HierarchyLevel
    FROM processDependency

    UNION ALL

    SELECT
        e.processName,
        e.dependProcessName,
        eh.HierarchyLevel + 1 AS HierarchyLevel
    FROM 
        processDependency e
    INNER JOIN 
        DependencyHierarchy eh ON e.dependProcessName = eh.processName
)
SELECT *
FROM DependencyHierarchy
ORDER BY HierarchyLevel, processName, dependProcessName;
GO
Run Code Online (Sandbox Code Playgroud)

它抛出此错误:

解析查询时出错.[令牌行号= 1,令牌行偏移= 1,令牌错误= WITH]

该表包含以下数据:

    processName dependProcessName
    P1          P2
    P2          P3
    P3          P4
    P4          P5
    P6          P7
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server common-table-expression sql-server-2008

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

为什么“WITH”子句在 Informix 上出现语法错误?

我正在 Informix 上尝试类似于以下查询的查询,但我每次都收到语法错误(-201:“发生语法错误”)。

with a_qry (locationnames) as (SELECT * FROM TABLE(LIST{'abc','xyz'}))
select locationnames from a_qry;
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

sql informix common-table-expression

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