我已经开始阅读有关Common Table Expression的内容,并且无法想到我需要使用它们的用例.它们似乎是多余的,因为派生表可以做到这一点.有什么我缺少或不理解?有人能给我一个简单的限制例子,通过常规的select,derived或temp表查询来说明CTE的情况吗?任何简单的例子都将受到高度赞赏.
在这个优秀的SO问题中,讨论了CTE
和之间的sub-queries
差异.
我想具体问一下:
在什么情况下,以下各项更有效/更快?
传统上,我temp tables
在开发中使用了很多stored procedures
- 因为它们看起来比许多交织在一起的子查询更具可读性.
Non-recursive CTE
s非常好地封装数据集,并且非常易读,但是在某些情况下可以说它们总能表现得更好吗?或者是否必须总是摆弄不同的选项才能找到最有效的解决方案?
编辑
我最近被告知,就效率而言,临时表是一个很好的首选,因为它们具有相关的直方图即统计数据.
WITH y AS (
WITH x AS (
SELECT * FROM MyTable
)
SELECT * FROM x
)
SELECT * FROM y
Run Code Online (Sandbox Code Playgroud)
这样的事情有用吗?我之前尝试过,但我无法让它发挥作用.
我有一个非常复杂的CTE,我想将结果插入物理表.
以下是否有效?
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos
(
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
WITH tab (
-- some query
)
SELECT * FROM tab
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用一个函数来创建这个CTE,这将允许我重用.有什么想法吗?
我有这个简单的T-SQL查询,它从表中发出一堆列,并且还连接来自其他相关表的信息.
我的数据模型很简单.我有一个预定的活动,与参与者.我需要知道有多少参与者参加每个活动.
我的解决方案是添加一个CTE,它对预定的事件进行分组并计算参与者的数量.
这将允许我按预定活动加入该信息.保持查询简单.
我喜欢让我的查询简单,但是,如果我将来需要在简单查询期间访问其他临时结果,我该怎么办?
我真的很喜欢它,如果我可以拥有多个CTE,但我不能,对吧?我有什么选择?
我已经在应用程序数据层排除了视图和操作.我更喜欢孤立我的SQL查询.
有两个版本的答案,其中一个使用a SubQuery
,另一个使用a CTE
来解决相同的问题.
那么,使用CTE (Common Table Expression)
over as 的优点是什么ub-query
(因此,查询实际上更具可读性)
使用CTE
over sub select 的唯一优点是我可以实际命名子查询.当CTE用作简单(非递归)CTE时,这两者之间是否存在其他差异?
哪个更高效,CTE
或者Temporary Tables
?
sql-server performance temp-tables common-table-expression sql-server-2008
我有一个MS SQL CTE查询,我想从中创建一个临时表.我不知道怎么做,因为它给出了一个Invalid Object name
错误.
以下是整个查询供参考
SELECT * INTO TEMPBLOCKEDDATES FROM
;with Calendar as (
select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays,EventStartTime,EventEndTime, EventRecurring, EventStartDate as PlannedDate
,EventType from EventCalender
where EventActive = 1 AND LanguageID =1 AND EventBlockDate = 1
union all
select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays,EventStartTime,EventEndTime, EventRecurring, dateadd(dd, 1, PlannedDate)
,EventType from Calendar
where EventRecurring = 1
and dateadd(dd, 1, PlannedDate) <= EventEndDate
)
select EventID, EventStartDate, EventEndDate, PlannedDate as [EventDates], Cast(PlannedDate As datetime) AS DT, Cast(EventStartTime …
Run Code Online (Sandbox Code Playgroud) 我不断得到max recursion error
这个查询.
起初我以为是因为返回null然后它会尝试匹配导致错误的空值,但是我重写了我的查询,因此不返回空值并且仍然会发生错误.
什么是重写此函数的最佳方法,以便不会发生错误
WITH EmployeeTree AS
(
SELECT
EMP_SRC_ID_NR Id, USR_ACV_DIR_ID_TE Uuid,
CASE Employees.APV_MGR_EMP_ID
WHEN Null THEN '0'
ELSE Employees.APV_MGR_EMP_ID
END as ApprovalManagerId
FROM
dbo.[tEmployees] as Employees WITH (NOLOCK)
WHERE
APV_MGR_EMP_ID = @Id
and Employees.APV_MGR_EMP_ID is not null
and Employees.EMP_SRC_ID_NR is not null
UNION ALL
SELECT
EMP_SRC_ID_NR Id, USR_ACV_DIR_ID_TE Uuid,
CASE Employees.UPS_ACP_EMP_NR
WHEN Null THEN '1'
ELSE Employees.UPS_ACP_EMP_NR
END as ApprovalManagerId
FROM
dbo.[tEmployees] as Employees WITH (NOLOCK)
WHERE
UPS_ACP_EMP_NR = @Id
and Employees.APV_MGR_EMP_ID is not null …
Run Code Online (Sandbox Code Playgroud) 我从不使用递归的CTE.我刚刚读了一篇关于它的文章.本文在Sql server CTE和递归的帮助下显示员工信息.它基本上显示了员工及其经理信息.我无法理解此查询的工作原理.这是查询:
WITH
cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
AS
(
SELECT EmployeeID, FirstName, LastName, ManagerID, 1
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
r.EmpLevel + 1
FROM Employees e
INNER JOIN cteReports r
ON e.ManagerID = r.EmpID
)
SELECT
FirstName + ' ' + LastName AS FullName,
EmpLevel,
(SELECT FirstName + ' ' + LastName FROM Employees
WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID
Run Code Online (Sandbox Code Playgroud)
这里我发布有关输出如何显示的信息:
我只需要知道它是如何首先显示管理器然后是循环中的下属.我想第一个sql语句只触发一次,并返回所有员工ID.
第二个查询重复触发,查询当前管理员ID所在的员工所在的数据库. …