Sql 何时使用表格运算符APPLY
我在试着理解table操作符的用法 以下是一个例子:Sql 何时使用表格运算符APPLY,sql,sql-server,sql-server-2012,cross-apply,sql-standards,Sql,Sql Server,Sql Server 2012,Cross Apply,Sql Standards,我在试着理解table操作符的用法 以下是一个例子: CREATE TABLE #y ( Name char(8), hoursWorked int); GO INSERT INTO #y VALUES ('jim',4); INSERT INTO #y VALUES ('michael',40); INSERT INTO #y VALUES ('raj',1000); INSERT INTO #y VALUES ('jason',7); INSERT INTO #y VALUES ('tim'
CREATE TABLE #y ( Name char(8), hoursWorked int);
GO
INSERT INTO #y VALUES ('jim',4);
INSERT INTO #y VALUES ('michael',40);
INSERT INTO #y VALUES ('raj',1000);
INSERT INTO #y VALUES ('jason',7);
INSERT INTO #y VALUES ('tim',50);
GO
CREATE TABLE #x ( Name char(8),game char(8), NumBets int);
GO
INSERT INTO #x VALUES ('jim','chess',4);
INSERT INTO #x VALUES ('jim','BG',10);
INSERT INTO #x VALUES ('jim','draughts',100);
INSERT INTO #x VALUES ('jim','football',5);
INSERT INTO #x VALUES ('michael','chess',40);
INSERT INTO #x VALUES ('michael','BG',7);
INSERT INTO #x VALUES ('michael','draughts',65);
INSERT INTO #x VALUES ('michael','football',50);
INSERT INTO #x VALUES ('raj','chess',400);
INSERT INTO #x VALUES ('raj','BG',70);
INSERT INTO #x VALUES ('raj','draughts',650);
INSERT INTO #x VALUES ('tim','draughts',60000);
GO
SELECT y.Name,
y.hoursWorked,
x.game,
x.NumBets
FROM #y y
OUTER APPLY
(
SELECT TOP 2 *
FROM #x
WHERE Name = y.Name
ORDER BY NumBets
) x
ORDER BY y.Name,
x.NumBets DESC;
我的主要障碍是理解何时使用APPLY。
因此,我想知道使用SQLServer2005中实现的标准sql获得与上述相同的结果有多困难?
APPLY是否使查询变得更短或更可读?
如果这个例子没有显示使用APPLY的巨大优势,那么使用APPLY的优势是什么呢?首先,使用APPLY可以调用表值函数,其中参数值取自您查询的表,如下所示:
select
t1.col3, -- column from table
f1.col1 -- column from function
from table1 as t1
left outer join table2 as t2 on t2.col1 = t1.col1
outer apply dbo.function1(t1.col1, t2.col2) as f1
或者分解xml列
使用apply的另一个示例是unpivot操作:
select
t1.col1, c.name, c.value
from table1 as t1
outer apply (
select 'col1', t1.col1 union all
select 'col2', t1.col2
) as c(name, value)
最后,以下是您在不使用apply的情况下使用SQL 2005实现的查询:
参见示例+1非常好的广泛答案-没有时间完全吸收这个雪人认为应用程序比2005年版本短。不太确定我是否会使用UNPIVOT版本-这是一个很好的技巧,但是由于同一版本的sql server附带了特定的UNPIVOT函数,为什么不直接使用它呢。似乎,对我来说,最好的应用程序将是它与TVF的交互以及应用程序计算的相关使用。我认为应用程序可能比row_数字更快,但对此不确定,必须稍后测试
select
t1.col3,
a1.col1, --calculated value
a2.col1 -- another calculated value, first one was used
from table1 as t1
outer apply (select t1.col1 * 5 as col1) as a1
outer apply (select a1.col1 - 4 as col1) as a2
select
t1.col1, c.name, c.value
from table1 as t1
outer apply (
select 'col1', t1.col1 union all
select 'col2', t1.col2
) as c(name, value)
;with cte as (
select
y.Name,
y.hoursWorked,
x.game,
x.NumBets,
row_number() over(partition by x.Name order by x.NumBets) as row_num
from y
left outer join x on x.Name = y.Name
)
select Name, hoursWorked, game, NumBets
from cte
where row_num <= 2
order by Name, NumBets desc