Questions tagged «cte»

通用表表达式的缩写。可能是递归的临时可重用子查询。

3
WITH CTE和WITH CTE(<column_names>)有什么区别?
如在MSDN上使用通用表表达式中所示,可以将CTE定义为: WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition ) 并像这样使用它: SELECT &lt;column_list&gt; FROM expression_name; 假设我有2个CTE with cte1 as( select name from Table1 ) with cte2(name) as( select name from Table1 ) 由于内部查询相同,因此两个CTE的查询输出结果相同。两者之间的唯一区别是cte2(name)在其声明中定义了列name()。 当我执行两个CTE时,执行计划没有任何区别。 我只是好奇地知道: 如果我在CTE定义中未指定任何列名,会有什么区别? 为什么在创建CTE时应该/不应该指定列名? 它是否会偶然影响查询执行计划?(据我所知,这没有任何区别。)

1
什么规则确定何时SQL Server使用CTE作为“优化围栏”?
不久前,Brent Ozar发表了一篇文章,详细介绍了SQL Server和PostgreSQL之间的一些区别: SQL Server与PostgreSQL之间的两个重要区别 第一点(“ CTE是优化栅栏”)引起了我的注意,因为很明显,在所提供的示例中,SQL Server将CTE和主查询组合在一起,并将其优化为单个查询(与之相反的行为是, PostgreSQL)。 但是,此行为似乎与我在其他博客和培训课程中看到的示例相反,在这些示例中,SQL Server确实将CTE视为优化围栏,从而可以更好地使用索引,提高性能等。例如: 选择星号的更好方法 因此,似乎SQL Server有时会“荣誉” CTE作为优化的围栏。是否有可用的良好资源来记录已知情况的特定列表,在这些情况下,SQL Server将可靠地认可CTE作为优化范围(或相反的行为)?

1
如何“提示”递归CTE的基数?
我使用以下递归CTE作为最小示例,但总的来说,优化程序必须对递归CTE使用默认的“猜测”基数: with recursive w(n) as ( select 1 union all select n+1 from w where n&lt;5 ) select * from w; /* n --- 1 2 3 4 5 */ explain analyze with recursive w(n) as ( select 1 union all select n+1 from w where n&lt;5 ) select * …

5
内联视图和WITH子句之间的区别?
内联视图使您可以从子查询中进行选择,就好像它是另一个表一样: SELECT * FROM /* Selecting from a query instead of table */ ( SELECT c1 FROM t1 WHERE c1 &gt; 0 ) a WHERE a.c1 &lt; 50; 我已经看到了使用不同术语来指代的内容:内联视图,WITH子句,CTE和派生表。在我看来,对于同一件事,它们是不同的供应商特定语法。 这是一个错误的假设吗?两者之间在技术/性能上有什么区别吗?

2
为什么带有参数的此递归CTE在处理文字时不使用索引?
我在树结构上使用递归CTE来列出树中特定节点的所有后代。如果我在WHERE子句中写入文字节点值,则SQL Server似乎实际上仅将CTE应用于该值,从而给出了具有较少实际行数的查询计划,等等: 但是,如果我将值作为参数传递,它似乎实现了(假脱机)CTE,然后在事实之后对其进行过滤: 我可能看错了计划。我还没有注意到性能问题,但是我担心CTE的实现会导致更大数据集的问题,尤其是在繁忙的系统中。另外,我通常会自己遍历此遍历:我遍历祖先,然后遍历到后代(以确保收集所有相关节点)。由于我的数据如何,每组“相关”节点都非常小,因此实现CTE没有任何意义。当SQL Server似乎意识到CTE时,它给我的“实际”数量带来了相当大的数目。 有没有办法让查询的参数化版本像文字版本一样工作?我想将CTE放在可重用的视图中。 用文字查询: CREATE PROCEDURE #c AS BEGIN; WITH descendants AS (SELECT t.ParentId Id ,t.Id DescendantId FROM #tree t WHERE t.ParentId IS NOT NULL UNION ALL SELECT d.Id ,t.Id DescendantId FROM descendants d JOIN #tree t ON d.DescendantId = t.ParentId) SELECT d.* FROM descendants d WHERE …

1
如何从以下查询中获取层次结构值?
我有一个名为的表Category,其中有一个名为的列CategoryID。同一张表中有一个引用列,称为fParentCategoryID。 我需要用逗号分隔所有类别ID及其子类别ID。例如-如果父类别ID为10,而父类别ID为20,则我打印类别ID 20时,我需要同时打印1和10作为其父,并以逗号分隔。 我尝试了以下查询,但我得到NULL了ParChild专栏。请帮忙。 ;WITH cteReports AS ( SELECT c.CategoryID, c.fParentCategoryID, [level] = 1, ParChild=cast(CAST(c.fParentCategoryID AS VARCHAR(200)) + ',' + CAST(c.CategoryID AS VARCHAR(200)) AS VARCHAR(MAX)) FROM retail.Category c WHERE c.fParentCategoryID is NULL UNION ALL SELECT c.CategoryID, c.fParentCategoryID, [level] + 1, ParChild = ParChild + ',' + CAST(c.CategoryID AS VARCHAR(200)) FROM …

3
在IF EXISTS查询中使用CTE
是否可以在SQL Server 2012中执行与以下类似的操作? IF EXISTS ( WITH DATA AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY column ORDER BY Column) AS rn FROM table ) SELECT * FROM DATA WHERE rn = 2 ) BEGIN ... END 我尝试使用此语法并收到错误。如果无法做到这一点,使用临时表是否是实现此目的的最佳方法?
8 sql-server  cte 

3
检查子查询结果中是否有任何值
我有一个复杂的子查询,该查询返回订单ID列表。我需要获得拥有这些订单的客户列表。问题是有两种将客户分配给订单的方式(两个字段之一)。我可以做这样的事情: select * from Customers where orderId in (select...) or secondaryOrderId in (select ...) 问题在于,子查询在执行时间和屏幕空间上都是巨大的。有没有一种方法可以检查其中一个字段是否包含所需结果之一?

1
为什么CTE对丢失的更新开放?
当克雷格·林格(Craig Ringer)评论时,我不明白他的意思: 如果插入事务回滚,则此解决方案可能会丢失更新。没有检查来强制UPDATE影响任何行。 在https://stackoverflow.com/a/8702291/14731上。请提供事件的样本序列(例如,线程1执行X,线程2执行Y),以演示丢失更新的发生方式。

1
递归CTE性能
需要递归CTE性能方面的帮助。低于CTE的速度非常慢,因为它试图以回溯方式提取分层数据。表很大,每个根ID最多具有3个递归itemid。可能有大约200000或更多根ID。我知道对于大型数据集,递归CTE的速度很慢,因为锚中的每个rootid都会递归itemid。 架构: Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime) 上表有超过一百万行。 CTE查询: ; With rootcte as ( select itemid from RootItem where rootid is null union all select r.itemid as RootId , i.itemid from RootItem i join rootcte r on i.rootid = r.itemid ) 我们无法修改表架构并使用继承权。我也尝试了while循环,但是那也很慢。 还有什么其他方法可以优化此查询? …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.