相关疑难解决方法(0)

SQL Server 中的临时表和表变量有什么区别?

这似乎是一个有很多神话和相互冲突的领域。

那么SQL Server中的表变量和本地临时表有什么区别呢?

sql-server t-sql temporary-tables

465
推荐指数
2
解决办法
24万
查看次数

公共表表达式 (CTE) 的好处?

msdn

与派生表不同,CTE 可以是自引用的,并且可以在同一个查询中多次引用。

我经常使用 CTE,但我从未深入思考使用它们的好处。

如果我在同一个查询中多次引用 CTE:

  • 是否有任何性能优势?
  • 如果我进行自联接,SQL Server 会扫描目标表两次吗?

sql-server cte

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

改进/重构慢查询的技巧?

我们来玩乐透吧!

好的。我有一个numbers80 行(数字 1-80)的表:

create table dbo.numbers (knum tinyint primary key identity);
Run Code Online (Sandbox Code Playgroud)

我有一张桌子,上面有drawid,每个数字都画出来了。

create table dbo.draws (drawid int, drawnumber tinyint);
Run Code Online (Sandbox Code Playgroud)

现在,鉴于该draws表可能包含以下数据:

drawid   drawnumber
  1         10
  1         36
  1         54
  1         75
  2          9
  2         45
  2         46
  2         72
Run Code Online (Sandbox Code Playgroud)

我想知道最后一次出现每种可能的三数排列是什么时候。

我正在使用这个:

declare @curdraw int
select @curdraw = max( drawid)-100 from draws;

select TOP 10 K1,K2,K3, @curdraw-max(d1.drawid)  from THREES 
inner join DrawNumbers d1 WITH (NOLOCK) ON K1 = D1.DRAWNUMBER
INNER JOIN DRAWNUMBERS D2 WITH (NOLOCK) …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2008 t-sql performance-tuning

5
推荐指数
1
解决办法
550
查看次数

为什么将 CTE 写入实际表会提供性能改进?

我是 CTE 的忠实粉丝。他们是最棒的。你知道,我知道,我们都知道。

今天,如果将 CTE 写入真实表,我的查询速度会提高 1000 倍左右。

查询本身在链接中,但我怀疑它并不重要。为简化起见,我需要一份保险单中所有索赔的清单,其中一项索赔满足特定条件(cat = 1)。

简化版本如下所示:

    with cat_claims as (select distinct pol_nbr from claims where cat = 1)

    select * from claims c
    inner join policies p on p.polnbr = c.polnbr
    inner join cat_claims cat on c.pol_nbr= cat.pol_nbr
Run Code Online (Sandbox Code Playgroud)

这是超级骗子慢。如果我重写它看起来像这样:

    with cat_claims as (select distinct claim_nbr from claims where cat = 1)

    select * into cat_claims
    from cat_claims

    select * from claims c
    inner join policies p on p.polnbr = c.polnbr
    inner join cat_claims cat …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

如何在 WHERE 子句中使用具有 RANK() OVER 的别名

我有一个查询,其中包含一个RANK() OVER函数,但我想在后面的 WHERE 子句中使用此列上显示的结果。我怎么写,因为我看过的所有其他问题都没有,RANK() OVER而且似乎更容易做到。这是声明:

USE SMSResults


SELECT Student_No,Result,Module_Name,Semester,Year,RANK() OVER (PARTITION BY Student_No ORDER BY Semester  DESC) AS Rnk
FROM tbl_results
WHERE Student_No = '201409'

ORDER BY Year DESC
Run Code Online (Sandbox Code Playgroud)

我想使用子句中的RnkWHERE

sql-server window-functions sql-server-2014

2
推荐指数
1
解决办法
7862
查看次数

为什么在此查询中使用 CTE 比使用 #Temp 表快得多?

我有 2 个不同的查询来识别重复(如下)。两个查询之间的唯一区别是一个使用 CTE,另一个使用 #Temp 表。

有谁知道为什么 CTE 比 #Temp 表快得多(0:20 秒 VS. 1:22)?

我宁愿使用 CTE,但我需要使用 CTE 运行 2 个 STATEMENTS(从 CTE 删除,然后从 CTE 插入表),但 SQL Server 只允许您在 CTE 上编写一个 STATEMENT。

查询 1:

WITH DUPS AS(
   Id,
   Column1,
   Column2,
   Column3,
   RN = ROW_NUMBER()OVER(PARTITION BY ID ORDER BY id)
   FROM mytable
)
  Select top 1 * FROM DUPS WHERE RN > 1 
Run Code Online (Sandbox Code Playgroud)

查询 2:

 SELECT    
           Id,
           Column1,
           Column2,
           Column3,
           RN = ROW_NUMBER()OVER(PARTITION BY ID ORDER BY id)
       INTO #DUPS
       FROM mytable …
Run Code Online (Sandbox Code Playgroud)

sql-server

2
推荐指数
1
解决办法
6561
查看次数