何时使用表运算符 APPLY

2023-12-22

我试图理解表运算符APPLY.

这是示例:

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;

我的主要障碍是理解when to use APPLY.
所以我想知道使用以下方法获得与上面相同的结果有多困难standard sql实施于sql-server 2005 ?
Does 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

or 分解 xml 列

select
    t1.col3,
    t.c.value('@value', 'int') as value
from table1 as t1
    -- table1.col1 is xml iike <Data @Value="...">...</Data>
    outer apply t1.col1.nodes('Data') as t(c) 

根据我的经验,apply当你必须做一些事情时非常有用预先计算:

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

另一个使用的例子apply is 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)

最后,这是您的查询根据 SQL 2005 实现,不使用apply:

;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

see sql小提琴 http://sqlfiddle.com/#!3/29055/5 example

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用表运算符 APPLY 的相关文章

  • Kerberos 双跳

    我们遇到了臭名昭著的 Kerberos 双跳问题 这是一个全新的域 是从以前使用模拟和委派的另一个提供商迁移而来的 我们已将操作系统升级到最新的 SQL 服务器 2017 WPF 应用程序 使用域凭据 gt Web 服务 IIS 10 上的
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 存储过程和权限 - EXECUTE 就足够了吗?

    我有一个 SQL Server 2008 数据库 其中对基础表的所有访问都是通过存储过程完成的 一些存储过程只是从表中选择记录 而其他存储过程则进行 UPDATE INSERT 和 DELETE 如果存储过程更新表 执行存储过程的用户是否也
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • Amazon RDS for SQL Server 是否支持 SSIS?

    从谷歌搜索中读到一些相互矛盾的答案 不确定答案是是 否还是可能 我觉得读的时候已经很清楚了this http docs aws amazon com AmazonRDS latest UserGuide CHAP SQLServer htm
  • PHP 通过 SSL 连接到 MS SQL

    我想要实现的目标非常简单 我想通过安全连接从 PHP 脚本连接到外部 MS SQL 数据库 然而 这已被证明是有问题的 到目前为止 经过三个小时的研究 我不知所措 客户端的平台是Ubuntu 这意味着我无法使用SQLSRV 安全连接已经在不
  • 选择具有 SQL Server XML 列类型的特定行

    我正在尝试从类似于以下定义的表中选择数据 Column Data Type Id Int DataType Int LoggedData XML 但我只想选择具有特定 DataType 值并且在 LoggedData 列中包含字符串 或评估
  • 单独的逗号分隔值并存储在sql server的表中

    我有一个存储过程 它将逗号分隔的值作为输入 我需要将其分开并需要将其作为单独的行存储在表中 令 SP 的输入为 Rule ID ListType ID Values 1 2 319 400 521 8465 2013 我需要将它存储在一个名
  • 为表中的每个组选择前 N 行

    我面临一个非常常见的问题 即 为表中的每个组选择前 N 行 考虑一个表id name hair colour score列 我想要一个结果集 对于每种头发颜色 都能得到前 3 名得分手的名字 为了解决这个问题 我得到了我所需要的Rick O
  • 为什么我可以像调用实例方法一样调用类方法?

    我正在查看这个例子 class SQLObject def self columns return columns if columns columns DBConnection execute2 lt lt SQL first SELEC
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • 如何在NiFi中映射流文件中的列数据?

    我有 csv 文件 其结构如下 Alfreds Centro Ernst Island Bacchus Germany Mexico Austria UK Canada 01 02 03 04 05 现在我必须将这些数据移入数据库 如下所示
  • SQL Server 上的语法错误

    这可能是一个愚蠢的语法错误 但我只是继续阅读我的程序 但我无法弄清楚我的错误在哪里 消息 156 第 15 级 状态 1 第 41 行关键字附近的语法不正确 为了 这是我的代码 alter procedure LockReservation

随机推荐

  • 将 GZIP:ed 文本存储在 mysql 中?

    对于较大的应用程序和数据库来说 在将文本数据插入数据库之前对其进行 GZIP 压缩是很常见的事情吗 我猜想在再次解压缩之前 对实际文本字段的任何全文搜索都将不起作用 我还没有看到太多这样的事情 因为它基本上可以防止人们对 MySQL 端的数
  • Redux、规范化实体和 lodash 合并

    我使用 Redux React 和 Lodash 以及相当标准的标准化实体存储 当我在 redux 减速器中合并新实体时 对所有现有实体的引用都会发生变化 尽管没有被修改 从而导致任何纯组件重新渲染 lodash 合并是否有一种替代方法 可
  • 铁轨变了?方法总是错误的

    我正在尝试检查我的模型中复选框值是否已更改 如果改变了我想要我的方法set ip setting跑进去before save but my x即使我更改值 变量也总是返回 false 为什么它总是返回错误 我不明白我做错了什么 before
  • C 和 C++ 中类型的互操作性

    一个非常简单的问题 是否有任何保证 Cint和 C 是一样的int 在同一系统上 不言而喻 这当然是一个纯粹的理论问题 C 和 C 标准使用相同的语言来定义基本类型 但是 Fortran 2003 明确指出 use ISO C BINDIN
  • 在 C 中将块指令作为宏的参数传递

    我不知道这是否可能 我想像参数一样在宏中传递指令块 我将向您展示一个示例 define ADD MACRO size BLOCK for int i 0 i
  • ASP NET MVC 3 - 如何首先使用两个表和 Database.Setinitializer 在代码中重置数据库?

    我的问题在于缺乏MVC经验 基本上 我在数据库中有两个表 人 提供 对于每个我都创建了一个模型 一个控制器和一个模型 因此结构如下所示 public class Offer public int OfferID get set public
  • 发送大尺寸图像、视频和音频时 XMPP 客户端断开连接

    我已经使用 robbiehanson xmpp 示例实现了 xmpp 我可以聊天 也可以发送图像 我发送的图像被转换为 nsdata 并进一步转换为 Base64String 然后发送字符串 self xmppStream sendElem
  • Google 日历 API 的换行符?

    我正在尝试从我的网络应用程序中插入 Google 日历中的事件描述 但无法获取 n 或 br 被解释为换行符 谷歌日历如何解释换行符 帮助将不胜感激 您使用特定的客户端库吗 如果使用该协议 只需在内容元素中添加换行符即可
  • Django 应用程序初始化代码(例如连接到信号)

    我需要一个地方来运行特定于应用程序的初始化代码 例如连接到信号 当我将代码放入 init py我最终得到了模型的循环导入 有没有办法在框架设置时和执行任何请求之前触发函数 我使用相当旧的 django 96 6 版本 但我也对当前版本的解决
  • CakePHP 保存外键问题

    我在将 用户 表的外键保存在另一个名为 基本 的表中时遇到问题 我试图向用户询问一系列问题 每个完成的系列问题和用户 ID 都应该保存到相应的表中 这是在模型中进行验证后保存我的数据的内容 验证成功 所有数据均已保存 但外键保存为 0 pu
  • 如何将Mandelbrot的每个像素计算划分到不同的节点上?

    我的问题是我应该使用什么数据结构将工作分配给每个线程并从中获取计算值 我首先想到的是用保存 x y 和 iterate value 的结构填充向量 0 向量 63999 对于800x800像素 将这些向量传递给每个节点 gt 然后将给定向量
  • 当元素数据更改时,jQuery data() 属性不会更新

    我想使用 jQuerydata api 用于检索元素的所有数据属性 但这个 api 的缓存性质确实很烦人 有时我需要更改 javascript 中元素的某些数据属性 但是data api 始终返回每个数据属性的初始值 所以我必须使用attr
  • 在python中创建具有一定宽度边框的图像

    我用过PIL back color width for x in range w for y in range h if x 0 or y 0 or x w 1 or y h 1 pixels x y back color 我需要向图像添加
  • 合并 pandas 数据框列表

    我有一个数据框列表 我需要使用唯一的列将它们合并在一起 date 字段名称不同 因此不能使用 concat 我可以手动使用df 0 merge df 1 on Date merge df 3 on Date 等等将每个df一一合并 但问题是
  • 即使用户允许,Gmail 也会隐藏外部电子邮件图像

    我正在尝试在 html 电子邮件中插入带有图像的签名 我在使用 GMail 时遇到一些问题 它在 iPhone 客户端上运行良好 在用户接受图像之前 它们的大小正确 并且替代文本可见 每个图像的 HTML 为 img alt Bonne w
  • 警告主要版本 52 比该编译器支持的最高主要版本 51 更新

    基本上我是超级新手 开始在IT公司实习 我用 Xamarin 安装了 VS 我面临的问题非常令人沮丧 因此 即使我创建空项目 我也无法编译它并收到如下错误 严重性代码 说明 项目文件行抑制状态 警告主要版本 52 比该编译器支持的最高主要版
  • 如何让 Eclipse 记住 Android SDK 位置?

    每当我尝试使用 Eclipse 创建新的 Android 项目 在空工作区中 时 构建目标 列表都是空的 因此 我需要取消 新建 Android 项目 对话框 然后转到首选项并重新输入 Android 的 SDK 位置 完成此操作后 我可以
  • Android:使用自定义视图从对话框中检索 EditText 值

    我使用 AlertDialog Builder 类创建了一个对话框 并调用 builder setView int resource 为其提供文本输入的自定义布局 当用户点击 确定 时 我试图从布局上的 EditText 检索值 但是当调用
  • 如何从div中删除class属性?

    我正在使用 JavaScript 如果单击按钮 我想添加 删除 Class 属性 我可以添加该类 但我不知道如何删除它 我怎样才能做到这一点 window onload function var buttonGo document getE
  • 何时使用表运算符 APPLY

    我试图理解表运算符APPLY 这是示例 CREATE TABLE y Name char 8 hoursWorked int GO INSERT INTO y VALUES jim 4 INSERT INTO y VALUES michae