不带 FROM 子句的 OUTER/CROSS APPLY 子查询

Man*_*ngo 2 sql sql-server cross-apply

大多数讨论的在线文档或教程都OUTER|CROSS APPLY描述了如下内容:

\n\n
SELECT columns\nFROM table OUTER|CROSS APPLY (SELECT \xe2\x80\xa6 FROM \xe2\x80\xa6);\n
Run Code Online (Sandbox Code Playgroud)\n\n

子查询通常是完整SELECT \xe2\x80\xa6 FROM \xe2\x80\xa6查询。

\n\n

我一定在某处读过,子查询不需要\xe2\x80\x99t,FROM 在这种情况下,列似乎来自主查询:

\n\n
SELECT columns\nFROM table OUTER|CROSS APPLY (SELECT \xe2\x80\xa6 );\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为我经常使用它作为预计算列的方法。

\n\n

问题是如果子FROM查询中省略了 ,到底会发生什么?是其他东西的缩写吗?我发现它和主表中的意思不一样。

\n\n

我这里有一个示例:http://sqlfiddle.com/#!18 /0188f7/4/1

\n

Mar*_*ith 5

首先考虑

SELECT o.name, o.type
FROM sys.objects o
Run Code Online (Sandbox Code Playgroud)

现在考虑

SELECT o.name, (SELECT o.type) AS type
FROM sys.objects o
Run Code Online (Sandbox Code Playgroud)

SELECT没有 a 的AFROM就好像从假想的单行表中进行选择。上面的内容不会改变结果,标量子查询只是充当相关子查询并使用外部查询中的值。

APPLY行为方式相同。对外部查询中列的引用只是作为相关参数传入。所以这与

SELECT o.name, ca.type
FROM sys.objects o
CROSS APPLY (SELECT o.type) AS ca
Run Code Online (Sandbox Code Playgroud)

APPLY总的来说比标量子查询功能更强大SELECT(因为它可以扩展行或从结果中删除行)