我在构造一个返回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) 我有下表
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
我正在尝试让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
我有一个查询,使用公用表表达式检索页面的所有模块和子模块.是否可以多次使用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) 我创建了一个使用多个CTE的复杂过程(主要用于递归分层工作).
在小样本数据集上,一切都按预期进行,但是当我将代码应用于大型数据集时,我收到了意外(和错误)的结果.
我想我已经把它缩小到了CTE.递归CTE是在几个早期CTE中处理的"馈送"数据,这似乎是问题所在.
我设置了一个示例数据集如下:
然后,我获取第一个CTE的结果,并在第二个CTE中执行自连接.
我期望所有行都加入,每个行都是自己的.实际发生的是不相等的行加入.
有人可以提供这种行为的解释吗?
我对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+加入SomeTable到Query1.
我处于以下情况:
Query1 单独运行需要约5秒(400k行).WITH语句后,查询的其余部分LEFT JOIN需要~15秒(400k行).因此,当使用WITH语句和LEFT JOIN就地运行整个查询时,我会期望查询及时完成,而我让它运行超过一个小时,一旦停止它只能达到11k行.
我显然是错的,但为什么呢?
sql-server performance with-statement common-table-expression sql-server-2008
我可以使用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) 我有以下类型的几个大查询(为了清楚起见简化了)。
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
我编写了一个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
我正在 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 ×9
sql-server ×3
t-sql ×2
informix ×1
oracle ×1
performance ×1
plpgsql ×1
postgresql ×1
recursion ×1
union-all ×1