Man*_*ngo 2 sql sql-server cross-apply
大多数讨论的在线文档或教程都OUTER|CROSS APPLY描述了如下内容:
SELECT columns\nFROM table OUTER|CROSS APPLY (SELECT \xe2\x80\xa6 FROM \xe2\x80\xa6);\nRun Code Online (Sandbox Code Playgroud)\n\n子查询通常是完整SELECT \xe2\x80\xa6 FROM \xe2\x80\xa6查询。
我一定在某处读过,子查询不需要\xe2\x80\x99t,FROM 在这种情况下,列似乎来自主查询:
SELECT columns\nFROM table OUTER|CROSS APPLY (SELECT \xe2\x80\xa6 );\nRun Code Online (Sandbox Code Playgroud)\n\n因为我经常使用它作为预计算列的方法。
\n\n问题是如果子FROM查询中省略了 ,到底会发生什么?是其他东西的缩写吗?我发现它和主表中的意思不一样。
首先考虑
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(因为它可以扩展行或从结果中删除行)