相关疑难解决方法(0)

何时使用公用表表达式(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万
查看次数

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万
查看次数

如何参考一次CTE两次?

我有一个非常胖的公用表表达式,其中包含行号,以便我可以返回分页结果集.我还希望在分页结果集之前返回与查询匹配的记录总数.

with recs as (select *, row_number() over (order by id) as rownum from ......)
select * from recs where rownum between @a and @b .... select count(*) from recs
Run Code Online (Sandbox Code Playgroud)

显然我上面的查询是不完整的,但它只是为了说明我的观点.我想要一页结果和匹配总数.如何在不必复制和粘贴整个20+线CTE的情况下完成此操作?

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

25
推荐指数
2
解决办法
3万
查看次数

可以重用子查询吗?

我在尝试执行查询时遇到了一些问题.我有两个表,一个包含元素信息,另一个表包含与第一个表的元素相关的记录.我们的想法是在同一行中获取元素信息和几条记录信息.

结构可以解释如下:

 table [ id, name ]
 [1, '1'], [2, '2']

 table2 [ id, type, value ]
 [1, 1, '2009-12-02']
 [1, 2, '2010-01-03']
 [1, 4, '2010-01-03']
 [2, 1, '2010-01-02']
 [2, 2, '2010-01-02']
 [2, 2, '2010-01-03']
 [2, 3, '2010-01-07']
 [2, 4, '2010-01-07']
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的目标:

 result [id, name, Column1, Column2, Column3, Column4]

 [1, '1', '2009-12-02', '2010-01-03', , '2010-01-03']
 [2, '2', '2010-01-02', '2010-01-02', '2010-01-07', '2010-01-07']
Run Code Online (Sandbox Code Playgroud)

以下查询获得了正确的结果,但在我看来效率非常低,不得不为每列迭代table2.无论如何都可以做一个子查询并重用它?

SELECT
      a.id,
      a.name,
      (select min(value) from table2 t where t.id = subquery.id and t.type = 1 group by …
Run Code Online (Sandbox Code Playgroud)

sql subquery query-optimization

20
推荐指数
2
解决办法
3万
查看次数

如何在sql中重用子查询?

我有如下查询

select columns
from (select columns1
      from result_set
      where condition_common and condition1) as subset1
      join
      (select columns2
       from result_set
       where condition_common and condition2) as subset2 
      on subset1.somekey = subset2.somekey
Run Code Online (Sandbox Code Playgroud)

我想以某种方式重用

select columns
from result_set
where condition_common
Run Code Online (Sandbox Code Playgroud)

我已经过度简化了上面的查询,但上面的选择实际上是庞大而复杂的.我不想承担确保两者同步的负担

我没有任何以编程方式重用它的方法.排除了T-SQL.我只能写简单的查询.这是应用限制.

有没有办法在单个语句中重用相同的子查询

sql t-sql sql-server subquery

12
推荐指数
1
解决办法
8212
查看次数

如何避免在同一个选择中多次重复计算表达式?

如何在同一个选择中多次使用计算列而不重复表达式而不使用公用表表达式或复杂子选择?

DECLARE @T TABLE ( NUM1 INT,NUM2 INT)
INSERT INTO @T VALUES (2,3);
INSERT INTO @T VALUES (5,7);
INSERT INTO @T VALUES(32,3);
INSERT INTO @T VALUES(6,8);

SELECT (NUM1+NUM2) [ADD], [ADD]*2, [ADD]/2,* FROM @T
Run Code Online (Sandbox Code Playgroud)

有没有办法在SQL Server 2005中解决这个问题?

sql t-sql sql-server sql-server-2005

4
推荐指数
1
解决办法
1861
查看次数

在WHERE-Clause中重用Select Expression中的子查询

当然不可能写

SELECT (some subselect) AS blah FROM t WHERE blah = 'const'
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?

  • SELECT (some subselect) FROM t WHERE (some subselect) = 'const'
  • 视图?
  • 存储功能?
  • HAVING?
  • 其他?

mysql alias subquery

3
推荐指数
1
解决办法
2811
查看次数