首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server应用和连接关键字指南

Server应用和连接关键字指南
EN

Stack Overflow用户
提问于 2014-03-18 11:22:06
回答 2查看 296关注 0票数 4

我读了一篇关于使用apply & join关键字的文章。参见一些SQL,其中一个示例使用内部联接&另一个使用apply关键字。

这是表图

代码语言:javascript
复制
SELECT E.EMPID, E.NAME, E.DEPTID, D.NAME 
FROM EMPLOYEE E 
INNER JOIN  DEPARTMENT D ON E.DEPTID = D.DEPTID

SELECT E.EMPID, E.NAME, E.DEPTID, CA.NAME 
FROM EMPLOYEE E
CROSS APPLY
    (SELECT * FROM DEPARTMENT D WHERE D.DEPTID = E.DEPTID) CA  

两个查询都返回相同的输出和相同的执行计划。这是这张照片

再次使用外部应用和左外部连接。

代码语言:javascript
复制
SELECT E.EMPID, E.NAME, E.DEPTID, D.NAME 
FROM EMPLOYEE E 
LEFT JOIN  DEPARTMENT D ON E.DEPTID = D.DEPTID

SELECT E.EMPID, E.NAME, E.DEPTID, OA.NAME 
FROM EMPLOYEE E
OUTER APPLY
    (SELECT * FROM DEPARTMENT D WHERE D.DEPTID = E.DEPTID) OA

现在,这两个查询都产生相同的输出和相同的执行计划。所以,我只是不明白在什么样的情况下,应该使用OUTER APPLYCROSS APPLY来代替内部联接或左外部联接?

因此,如果可能的话,请提供相同的场景,即应该使用OUTER APPLY or CROSS APPLY

EN

Stack Overflow用户

回答已采纳

发布于 2014-03-18 11:44:38

您想要做的一件相对常见的事情是根据拆分器将列拆分为多个值。所以,网络上有各种各样的split()功能(实际上很多很多)。Here是从这样一个问题的随机答案中派生出来的一个小例子:

代码语言:javascript
复制
  SELECT d.RawKey, d.delimitedstring, d.delimitedvalues, 
         c.items SplitString, 
         c.rn
  FROM dbo.tblRawData d CROSS APPLY
       dbo.Split(d.DelimitedString, ',') c

这将是一个致命的应用程序,因为在SQL语句中没有其他方法可以做到这一点。

另一种情况是返回多个值,其中可能有一个相关的子查询:

代码语言:javascript
复制
select t1.*,
       (select t2.col from table2 t2 where t2.col1 = t1.col2) as newcol
from table1 t1;

很简单,但是如果要返回多个列,则需要多个子查询。相反:

代码语言:javascript
复制
select t1.*, t2.*
from table1 t1 cross apply
     (select t2.col1, t2.col3, t2.col4
      from table2 t2
      where t2.col1 = t1.col2
     ) t2;

这可能是使用其他操作符编写的(特别是在这个简单的例子中)。但是,如果table2实际上是多个表与其他逻辑连接在一起,那么重写它可能会非常复杂。

不过,一般来说,您应该在适当的地方坚持使用join。也许10年后,这看起来会像,from条款中那样“过时”。但就目前而言,联接是SQL和数据处理中的一个关键概念。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22477846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档