标签: common-table-expression

何时使用公用表表达式(CTE)

我已经开始阅读有关Common Table Expression的内容,并且无法想到我需要使用它们的用例.它们似乎是多余的,因为派生表可以做到这一点.有什么我缺少或不理解?有人能给我一个简单的限制例子,通过常规的select,derived或temp表查询来说明CTE的情况吗?任何简单的例子都将受到高度赞赏.

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

219
推荐指数
7
解决办法
33万
查看次数

CTE,子查询,临时表或表变量之间是否存在性能差异?

在这个优秀的SO问题中,讨论了CTE和之间的sub-queries差异.

我想具体问一下:

在什么情况下,以下各项更有效/更快?

  • CTE
  • 子查询
  • 临时表
  • 表变量

传统上,我temp tables在开发中使用了很多stored procedures- 因为它们看起来比许多交织在一起的子查询更具可读性.

Non-recursive CTEs非常好地封装数据集,并且非常易读,但是在某些情况下可以说它们总能表现得更好吗?或者是否必须总是摆弄不同的选项才能找到最有效的解决方案?


编辑

我最近被告知,就效率而言,临时表是一个很好的首选,因为它们具有相关的直方图即统计数据.

sql t-sql sql-server subquery common-table-expression

200
推荐指数
4
解决办法
12万
查看次数

您可以为公用表表达式创建嵌套的WITH子句吗?

WITH y AS (
    WITH x AS (
        SELECT * FROM MyTable
    )
    SELECT * FROM x
)
SELECT * FROM y
Run Code Online (Sandbox Code Playgroud)

这样的事情有用吗?我之前尝试过,但我无法让它发挥作用.

sql t-sql sql-server nested common-table-expression

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

结合INSERT INTO和WITH/CTE

我有一个非常复杂的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 insert common-table-expression

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

保持简单以及如何在查询中执行多个CTE

我有这个简单的T-SQL查询,它从表中发出一堆列,并且还连接来自其他相关表的信息.

我的数据模型很简单.我有一个预定的活动,与参与者.我需要知道有多少参与者参加每个活动.

我的解决方案是添加一个CTE,它对预定的事件进行分组并计算参与者的数量.

这将允许我按预定活动加入该信息.保持查询简单.

我喜欢让我的查询简单,但是,如果我将来需要在简单查询期间访问其他临时结果,我该怎么办?

我真的很喜欢它,如果我可以拥有多个CTE,但我不能,对吧?我有什么选择?

我已经在应用程序数据层排除了视图和操作.我更喜欢孤立我的SQL查询.

t-sql sql-server common-table-expression

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

CTE和SubQuery之间的区别?

从这篇文章如何在以下过程中使用ROW_NUMBER?

有两个版本的答案,其中一个使用a SubQuery,另一个使用a CTE来解决相同的问题.

那么,使用CTE (Common Table Expression)over as 的优点是什么ub-query(因此,查询实际上更具可读性)

使用CTEover sub select 的唯一优点是我可以实际命名子查询.当CTE用作简单(非递归)CTE时,这两者之间是否存在其他差异

sql t-sql sql-server subquery common-table-expression

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

129
推荐指数
9
解决办法
15万
查看次数

如何使用SELECT*INTO tempTable FROM CTE Query创建Temp表

我有一个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)

sql sql-server common-table-expression

127
推荐指数
6
解决办法
110万
查看次数

在语句完成之前,最大递归100已用尽

我不断得到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)

sql stored-procedures common-table-expression

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

SQL Server CTE和递归示例

我从不使用递归的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所在的员工所在的数据库. …

sql-server common-table-expression

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