这似乎是一个有很多神话和相互冲突的领域。
那么SQL Server中的表变量和本地临时表有什么区别呢?
从msdn:
与派生表不同,CTE 可以是自引用的,并且可以在同一个查询中多次引用。
我经常使用 CTE,但我从未深入思考使用它们的好处。
如果我在同一个查询中多次引用 CTE:
我们来玩乐透吧!
好的。我有一个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) 我是 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) 我有一个查询,其中包含一个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)
我想使用子句中的Rnk列WHERE
我有 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)