tsql 添加表列sql_将APPLY添加到TSQL工具带

tsql 添加表列sql

偶尔我偶然遇到一些我并不真正知道SQL关键字,但是它非常有用。

前几天,我遇到了APPLY,或者更确切地说是CROSS APPLY。

在阅读了有关其工作原理的文档和相关文章之后,我有点难以理解,因为我找不到真正的简单解释。

我将尝试尽可能简单地解释它,以便您可以立即开始使用它。

交叉申请的工作方式

CROSS APPLY背后的基本思想是允许您将两组数据连接在一起。

如果您了解INNER JOIN的工作原理,那么您已经了解了CROSS APPLY。

唯一的区别是,CROSS APPLY还允许您加入创建或依赖于第一组每一行的一组数据。

因此,基本上,这意味着对于普通联接,例如,将两个共享一个公用键的表联接在一起。

我可以将我的客户表加入到订单表中,以查看特定客户的所有订单,如下所示:

SELECT *
FROM
 orders o
 JOIN customers c
 	ON o.customerid = c.customerid
WHERE
 c.companyname = 'Around the Horn'

注意联接如何对每个表中独立存在的键进行操作。

我们可以使用CROSS APPLY语法将其重写为完全相同,如下所示:

SELECT *
FROM
  orders o
  CROSS APPLY (
    SELECT *  FROM
	   customers c
    WHERE
	   o.customerid = c.customerid) AS c
WHERE
  c.companyname = 'Around the Horn'

我们可以使用EXCEPT来确保这些结果集完全相同,以确保其中一个集合中没有行不在另一行中,然后将其翻转,如下所示:

SELECT *
FROM
    orders o
    CROSS APPLY (SELECT *
                 FROM
                     customers c
                 WHERE
                     o.customerid = c.customerid) AS c
WHERE
    c.companyname = 'Around the Horn'

EXCEPT
SELECT *
FROM
    orders o
    JOIN customers c
        ON o.customerid = c.customerid
WHERE
    c.companyname = 'Around the Horn'

只需再次运行此精确查询,将EXCEPT上方SQL与下面SQL交换,并确保它也没有结果。 如果这两个查询都没有结果,那么您会知道每个查询的结果都是相同的,因为EXCEPT将显示在顶部查询中但不在底部查询中的所有结果。

那么CROSS APPLY何时有用?

还记得我曾说过它可以做的不仅仅是简单的联接吗? 连接被限制为仅连接可能是彼此独立的查询的两组数据。

如果我说给我每个客户最近的三个订单怎么办?

花一点时间考虑一下如何编写该查询。 继续尝试。 我会等。

有几种不使用CROSS APPLY的方法,但是它们都不是非常简单或性能非常好。

使用CROSS APPLY很简单:

SELECT *
FROM
    customers c
    CROSS APPLY (
                 SELECT TOP 3 o.orderdate
                            , o.shipcity
                 FROM
                     orders o
                 WHERE
                     o.customerid = c.customerId
order by o.orderdate desc
) as top3;

因此,CROSS APPLY很有用,只要您有一些想要连接的数据,但是由于您要连接的数据不能很好地映射到单个数据而被迫执行某种子查询键。

使用CROSS APPLY的另一个实例是,当您进行的子选择具有多个要在最终查询中使用的值时。

例如,如果您要从“订单明细”表中进行子选择,以匹配数量大于5的数量的订单ID,则该子选择将仅需要返回一列,以便您在where子句中使用它。 如果要使用子选择中的其他列,则必须对这些列中的每一个都进行另一个子选择。

如果您首先尝试将子选择重写为JOIN,但发现您做不到,则可以将其作为CROSS APPLY编写。

如何知道何时使用CROSS APPLY

没有一个好的固定规则可以确定何时应该使用CROSS APPLY,但是了解CROSS APPLY以及它如何工作可以在您尝试优化查询时遇到困难,并且您很难构建一个CROSS APPLY。 。 您可以尝试另一种选择。

以下是一些可能需要使用CROSS APPLY时的一般准则:

  • 您要加入的结果集在某种程度上与第一个数据集相关的查询。 (示例:第一个表中的一列告诉您第二个表中要获取多少行)
  • 您正在执行子查询的查询,但是该子查询需要多个值
  • 您在使用公用表表达式(CTE)的任何地方都可能被重写为CROSS APPLY
  • 一个查询,其中包含大量要加入的数据集,然后将其过滤掉。 您可以将其更改为在CROSS APPLY语句中执行过滤器的CROSS APPLY。
  • 每当您尝试加入表函数时(实际上就是为此创建CROSS APPLY的。)

参考:在“ 使复杂性变得简单”中,由我们的JCG合作伙伴 John Sonmez 将APPLY添加到您的TSQL工具带中

相关文章 :


翻译自: https://www.javacodegeeks.com/2011/09/add-apply-to-your-tsql-tool-belt.html

tsql 添加表列sql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值