问题标签 [common-table-expression]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
346 浏览

tsql - T-SQL - 如何通过 CTE 中的限制绕过订单

我有以下 CTE。其目的是提供独特的月/年对。稍后的代码将使用 CTE 生成月/年对的串联字符串列表。

我省略了 GetMonthAndYearString 函数的实现,因为它很简单。

编辑:按照马丁的要求,这里是周围的代码:

可悲的是,似乎 T-SQL 总是领先一步。当我运行此代码时,它告诉我不允许在 CTE 中使用 ORDER BY,除非我也使用 TOP(或 FOR XML,不管是什么)。如果我使用 TOP,它会告诉我不能使用它与不同。是的,T-SQL 有所有的答案。

谁能想到比简单地割腕更快的解决这个问题的方法?我知道失血导致的死亡可能会令人惊讶地挥之不去,而且我有最后期限要赶上。

谢谢你的帮助。

大卫

0 投票
1 回答
1082 浏览

sql-server - SQL 中的条件公用表表达式 (CTE)

我正在尝试在 SQL 中选择产品类别树的层次结构。

我的代码如下所示。我正在尝试在 SortOrder 参数上使用 IF 或 Case When 来实现动态排序顺序。

如果@SortOrder 等于'sortorder',注释行应该是活动的。我试图在它周围添加 If Else 语句,但我失败了......

你能帮我吗?

0 投票
1 回答
6978 浏览

sql-server - 自联接中引用的 SQL Server CTE 速度慢

我编写了一个表值 UDF,它以 CTE 开头,以从大表中返回行的子集。CTE 中有几个连接。几个内连接和一个左连接到其他表,这些表不包含很多行。CTE 有一个 where 子句,它返回一个日期范围内的行,以便只返回需要的行。

然后,我在 4 个自左连接中引用此 CTE,以便使用不同的标准构建小计。

查询非常复杂,但这里是它的简化伪版本

我感觉 SQL Server 感到困惑并为每个自连接调用 CTE,这似乎通过查看执行计划得到证实,尽管我承认不是阅读这些的专家。

我会假设 SQL Server 足够聪明,只能从 CTE 执行一次数据检索,而不是多次执行。

我尝试了相同的方法,但没有使用 CTE 来获取数据子集,而是使用了与 CTE 中相同的选择查询,但将其输出到临时表。

引用 CTE 版本的版本需要 40 秒。引用临时表的版本需要 1 到 2 秒。

为什么 SQL Server 不够智能,无法将 CTE 结果保存在内存中?

我喜欢 CTE,尤其是在这种情况下,因为我的 UDF 是一个表值的,所以它允许我将所有内容保存在一个语句中。

要使用临时表,我需要编写一个值为 UDF 的多语句表,我发现它是一个稍微不那么优雅的解决方案。

你们中的一些人是否在 CTE 中遇到过这种性能问题,如果有,你们是如何解决这些问题的?

谢谢,

卡洛斯

0 投票
3 回答
1031 浏览

sql-server - SQL Server 多语句 UDF - 暂时需要存储数据的方式

我有一个相对复杂的查询,有几个自连接,适用于一个相当大的表。为了使该查询更快地执行,我只需要处理数据的一个子集。根据传递的参数,所述数据子集的范围可以在 12 000 到 120 000 行之间。

可以在此处找到更多详细信息:SQL Server CTE 在自连接中引用缓慢

如您所见,我之前使用 CTE 返回数据子集,这导致了一些性能问题,因为 SQL Server 为每个连接重新运行 CTE 中的 Select 语句,而不是简单地运行一次并重用其数据集。

另一种方法是使用临时表工作得更快(同时在 UDF 主体之外的单独窗口中测试查询)。但是,当我尝试在多语句 UDF 中实现这一点时,SQL Server 严厉提醒我,由于某种原因,多语句 UDF 不支持临时表......

但是,UDF 确实允许表变量,所以我尝试了,但性能非常糟糕,因为我的查询需要 1 分 40 秒才能完成,而 CTE 版本需要 40 秒。我认为由于此线程中列出的原因,表变量很慢:SQL Server 存储过程中插入时表变量性能不佳

临时表版本大约需要 1 秒,但由于 SQL Server 的限制,我无法将其转换为函数,我必须将表返回给调用者。

考虑到 CTE 和表变量都太慢,并且临时表在 UDF 中被拒绝,为了让我的 UDF 快速执行,我有哪些选择?

提前非常感谢。

0 投票
3 回答
6057 浏览

sql - 是否可以使用 CTE 将列值连接成字符串?

假设我有下表:

是否可以使用递归 CTE 生成以下输出:

我已经玩了一点,但无法让它工作。使用不同的技术我会做得更好吗?

0 投票
3 回答
4115 浏览

sql - SQL Server 2008 CTE 递归

我正在尝试执行我认为使用 CTE 是 SQL Server 2008 的困难递归。我似乎无法解决这个问题。

在下面的示例中,您可以假设固定深度为 3……没有什么比这更低了。在现实生活中,深度“更深”但仍然是固定的。在示例中,我尝试将其简化一些。

我的输入数据如下所示。

我的 CTE 的输出应该是下表。

如果我可以在输出中获得 ID 列,我当然可以映射到查找表中的名称。

我也愿意接受其他方法来实现这一点,包括使用 SSIS。

0 投票
2 回答
3751 浏览

sql - SQL Server 是否支持类似 Oracle 的 WITH 子句?

我已经看到这里多次提到 Oracle WITH 子句,用于对这样的子查询进行别名:

是否有任何版本的 SQL Server 支持此功能?如果没有,他们不这样做有什么特别的原因吗?表现?潜在的错误使用?

0 投票
3 回答
1459 浏览

sql - 计算 SQL 公用表表达式中列的中位数

在 MSSQL2008 中,我尝试使用经典的中值查询从公用表表达式中计算一列数字的中值,如下所示:

我得到的结果集如下:

换句话说,当我希望中值列一直向下为“x1”时,“中值”列与“数字”列相同。我使用一个类似的表达式来计算模式,它在同一个公用表表达式上工作得很好。

0 投票
3 回答
5566 浏览

sqlite - SQLite 中的常用表表达式功能

我需要将两个连续的聚合函数应用于数据集(一系列平均值的总和),这可以通过 SQL Server 或另一个支持 CTE 的 DBMS 中的公用表表达式轻松且常规地完成。不幸的是,我目前坚持使用不支持 CTE 的 SQLite。是否有替代方法或解决方法可以在 SQLite 中实现相同的结果,而无需执行两个查询并在代码中汇总结果?

要添加更多细节,我认为使用视图不容易做到这一点,因为需要根据具有多个参数的 WHERE 子句检索第一组聚合值。例如,

然后我需要这些平均值的总和。

0 投票
4 回答
4589 浏览

sql-server - Row_Number() 使用 ORDER BY CASE 时的 CTE 性能

我有一个表,我想对其进行分页和排序,并且能够获得类似于以下内容的查询来完成工作(真正的查询更多地涉及连接等)。

ORDER BY Date desc问题在于,与普通子句相比,使用 CASE 语句时性能会严重下降(至少减速 10 倍) 。查看查询计划,所有列似乎仍在排序,即使它们与 @sortCol 限定符不匹配。

有没有办法让它以接近“本机”的速度执行?动态 SQL 是解决这个问题的最佳选择吗?谢谢!