Questions tagged «cte»

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

7
CTE和临时表之间有什么区别?
公用表表达式(CTE)和临时表之间有什么区别?我什么时候应该使用另一个? CTE WITH cte (Column1, Column2, Column3) AS ( SELECT Column1, Column2, Column3 FROM SomeTable ) SELECT * FROM cte 临时表 SELECT Column1, Column2, Column3 INTO #tmpTable FROM SomeTable SELECT * FROM #tmpTable
174 sql-server  cte 


3
公用表表达式(CTE)的好处?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 来自msdn: 与派生表不同,CTE可以是自引用的,并且可以在同一查询中多次引用。 我已经大量使用了CTE,但是我从来没有考虑使用它们的好处。 如果我在同一查询中多次引用CTE: 有什么性能上的好处? 如果我正在执行自我联接,SQL Server将扫描目标表两次吗?
21 sql-server  cte 

4
SQL递归实际上如何工作?
来自其他编程语言的SQL,递归查询的结构看起来很奇怪。一步一步地走,它似乎崩溃了。 考虑以下简单示例: CREATE TABLE #NUMS (N BIGINT); INSERT INTO #NUMS VALUES (3), (5), (7); WITH R AS ( SELECT N FROM #NUMS UNION ALL SELECT N*N AS N FROM R WHERE N*N < 10000000 ) SELECT N FROM R ORDER BY N; 让我们来看一看。 首先,执行锚成员并将结果集放入R。因此R初始化为{3,5,7}。 然后,执行降到UNION ALL以下,并且第一次执行递归成员。它在R上执行(即在我们当前拥有的R上:{3,5,7})。结果为{9,25,49}。 这个新结果如何处理?是否将{9,25,49}附加到现有的{3,5,7}上,标记结果并集R,然后从那里进行递归?还是将R重新定义为仅此新结果{9,25,49},然后再进行所有合并? 两种选择都没有道理。 如果R现在为{3,5,7,9,25,49}并且执行递归的下一个迭代,那么我们将以{9,25,49,81,625,2401}结束,并且失去了{3,5,7}。 如果现在R仅是{9,25,49},则存在标签错误的问题。R被理解为锚定成员结果集与所有后续递归成员结果集的并集。而{9,25,49}只是R的一个组成部分。到目前为止,我们还没有获得R的全部。因此,将递归成员写为从R中选择是没有意义的。 …

5
创建计划指南以缓存(延迟假脱机)CTE结果
我通常会通过首先构造一个使用正确计划的查询,然后将其复制到不使用该计划的类似查询中来创建计划指南。但是,有时这很棘手,尤其是在查询不完全相同的情况下。从头开始创建计划指南的正确方法是什么? SQLKiwi提到了在SSIS中制定计划,是否有一种方法或有用的工具来帮助制定SQL Server的良好计划? 有问题的特定实例是以下CTE:SQLFiddle with cte(guid,other) as ( select newid(),1 union all select newid(),2 union all select newid(),3) select a.guid, a.other, b.guid guidb, b.other otherb from cte a cross join cte b order by a.other, b.other; 有没有任何方法来使结果拿出正好3个不同的guidS和没有更多?我希望将来能够通过将计划指南与CTE类型的查询一起使用来更好地回答问题,这些指南被多次引用以克服某些SQL Server CTE怪癖。
19 sql-server  t-sql  cte 

2
递归CTE为所有子代查找总计
这是我要使用递归T-SQL查询(大概是CTE)与以下预期结果进行搜索的程序集树。我想知道给定零件的每个组件的总数。 这意味着如果我搜索“铆钉”,我想知道装配体中每个级别的总数量,而不仅仅是直接子数量。 Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 , 1 目前,我可以得到直系父母,但想知道如何扩展我的CTE,以使我可以将此信息向上滚动。 With …

2
使用WITH进行多项操作
有没有一种方法可以使用该WITH语句执行多个操作? 就像是 WITH T AS ( SELECT * FROM Tbl ) BEGIN OPEN P_OUTCURSOR FOR SELECT * FROM T; SELECT COUNT(*) INTO P_OUTCOUNT FROM T; END; 我想选择一些数据及其数量...
16 oracle  select  cte 

2
PostgreSQL递归后代深度
我需要根据祖先计算后代的深度。当记录具有时object_id = parent_id = ancestor_id,它将被视为根节点(祖先)。我一直在尝试使WITH RECURSIVE查询与PostgreSQL 9.4一起运行。 我不控制数据或列。数据和表架构来自外部来源。桌子在不断增长。目前每天约有3万条记录。树中的任何节点都可能丢失,并且它们有时会从外部源中拉出。通常按created_at DESC顺序提取它们,但是使用异步后台作业提取数据。 最初,我们有一个解决此问题的代码,但现在有5M +行,需要近30分钟才能完成。 表定义和测试数据示例: CREATE TABLE objects ( id serial NOT NULL PRIMARY KEY, customer_id integer NOT NULL, object_id integer NOT NULL, parent_id integer, ancestor_id integer, generation integer NOT NULL DEFAULT 0 ); INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation) …

3
优化CTE层次结构
在下面更新 我有一个具有典型acct /父帐户体系结构的帐户表来表示帐户层次结构(SQL Server 2012)。我使用CTE创建了一个VIEW,以散列层次结构,总的来说,它可以按预期的方式很好地工作。我可以在任何级别查询层次结构,并轻松查看分支。 需要根据层次结构返回一个业务逻辑字段。每个帐户记录中的一个字段描述了企业的规模(我们将其称为CustomerCount)。我需要报告的逻辑需要从整个分支汇总CustomerCount。换句话说,给定一个帐户,我需要对该帐户以及层次结构中该帐户下方每个分支中的每个子级的客户计数值进行汇总。 我使用CTE中内置的层次结构字段成功计算了该字段,该字段类似于acct4.acct3.acct2.acct1。我遇到的问题只是使其运行速度很快。如果没有这一计算字段,查询将在约3秒内运行。当我在计算字段中添加时,它变成一个4分钟的查询。 这是我能够想到的最佳版本,它可以返回正确的结果。我正在寻找有关如何在不牺牲性能的前提下重新构建此“视图”的想法。 我知道这种方法运行缓慢的原因(需要在where子句中计算谓词),但是我想不出另一种方法来构造它并仍然得到相同的结果。 这是一些示例代码,用于构建表并完全按照其在我的环境中的工作方式执行CTE。 Use Tempdb go CREATE TABLE dbo.Account ( Acctid varchar(1) NOT NULL , Name varchar(30) NULL , ParentId varchar(1) NULL , CustomerCount int NULL ); INSERT Account SELECT 'A','Best Bet',NULL,21 UNION ALL SELECT 'B','eStore','A',30 UNION ALL SELECT 'C','Big Bens','B',75 UNION ALL …

2
从CTE内部调用时未执行PostgreSQL函数
只是希望确认我的观察并获得关于为什么发生这种情况的解释。 我有一个函数定义为: CREATE OR REPLACE FUNCTION "public"."__post_users_id_coin" ("coins" integer, "userid" integer) RETURNS TABLE (id integer) AS ' UPDATE users SET coin = coin + coins WHERE userid = users.id RETURNING users.id' LANGUAGE "sql" COST 100 ROWS 1000 VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER 当我从CTE调用此函数时,它将执行SQL命令,但不会触发该函数,例如: WITH test AS (SELECT …
14 postgresql  cte 

2
为什么CTE应该以分号开头?
我只是在看StackOverflow上的一篇文章,其中Aaron Bertrand建议使用CTE代替数字表,这是一种执行手头任务的优雅方法。我的问题是,为什么CTE的第一行以分号开头? ;WITH n AS (SELECT TOP (10000) n FROM (SELECT n = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ) AS x ORDER BY n ) SELECT n FROM n ORDER BY n; -- look ma, no gaps! 这是为了确保WITH语句不会被解析为先前的内容SELECT或其他内容?我在SQL Server 2005 BOL中看不到有关在WITH之前使用分号的任何信息。
14 sql-server  t-sql  cte  syntax 

2
为什么不能在同一条语句中更新插入CTE中的行?
在PostgreSQL 9.5中,给出了一个使用以下命令创建的简单表: create table tbl ( id serial primary key, val integer ); 我运行SQL插入一个值,然后在同一条语句中更新它: WITH newval AS ( INSERT INTO tbl(val) VALUES (1) RETURNING id ) UPDATE tbl SET val=2 FROM newval WHERE tbl.id=newval.id; 结果是UPDATE被忽略: testdb=> select * from tbl; ┌────┬─────┐ │ id │ val │ ├────┼─────┤ │ 1 │ …
13 postgresql  cte 

1
如何从SQL Server审核数据中筛选出标量值用户定义的函数用法?
我们有一个SQL Server数据库,该数据库具有数据库审核规范,该规范审核数据库上所有执行的操作。 CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) 我们发现,某些查询将对结果集中的每一行使用标量函数写入审核日志。当发生这种情况时,在将日志ETL放入最终的静止位置之前,日志已填满,并且日志记录中存在空白。 不幸的是,由于合规性原因,我们不能简单地停止审核每条EXECUTE声明。 解决此问题的方法首先想到的是使用WHERE“ 服务器审核”上的子句来过滤活动。代码如下所示: WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) 不幸的是,SQL Server不允许使用关系IN运算符(可能是因为它不想在每次必须写入审核日志时都进行查询)。 我们想避免编写一个存储过程,其硬代码object_id中WHERE条款,但是这是我们在解决这个问题的最好办法目前的想法。我们是否应该考虑替代方法? 我们注意到,当在递归CTE中使用标量函数时,它将导致查询将查询写入结果集中的每一行。 供应商提供了一些标量值函数,我们无法删除或移动到备用数据库。

1
如何以扩展的树状方式对递归查询的结果进行排序?
假设您有一个nodes这样的表: CREATE TABLE nodes ( node serial PRIMARY KEY, parent integer NULL REFERENCES nodes(node), ts timestamp NOT NULL DEFAULT now() ); 它代表一个标准的类节点树结构,其中根节点在顶部,几个子节点与根节点或其他子节点悬挂在一起。 让我们插入几个示例值: INSERT INTO nodes (parent) VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1) , (6), (9), (6), (6), (3), (3), (3), (15); 现在,我要检索前10个根节点及其所有子节点,深度为4: WITH RECURSIVE …

1
使用类型修饰符的数据类型的结果令人惊讶
在讨论此问题的递归CTE解决方案时: 获取每个ID的最后5个不同的值 @ypercube偶然发现了一个令人惊讶的异常,这使我们研究了类型修饰符的处理。我们发现了令人惊讶的行为。 1.类型转换在某些情况下保留类型修饰符 即使指示不要这样做。最基本的例子: SELECT 'vc8'::varchar(8)::varchar varchar至少我会期望(没有修饰符)。但是结果是varchar(8)(带有修饰符)。在下面的小提琴中有许多相关案例。 2.数组串联在某些情况下会丢失类型修饰符 不需要,因此在另一侧犯了错误: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) 第一个表达式产生varchar(8)[]预期的效果。 但是第二个,在连接另一个之后,varchar(8)会减少到varchar[](无修饰符)。array_append()以下小提琴中的示例提供类似的行为。 在大多数情况下,所有这些都无关紧要。Postgres不会丢失数据,并且当分配给列时,无论如何该值都被强制为正确的类型。但是,在相反方向上的错误最终导致一个令人惊讶的异常: 3.递归CTE要求数据类型完全匹配 给出此简化表: CREATE TABLE a ( vc8 varchar(8) -- with modifier , vc varchar -- without ); INSERT INTO a VALUES ('a', 'a'), ('bb', 'bb'); 尽管此rCTE适用于该varchar列vc,但不适用于该varchar(8)列vc8: WITH RECURSIVE cte AS ( …

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.