写在前面

刚才看项目里一个存储过程,也是好长时间没有使用Sql Server2008了,好多写法和函数感觉到陌生,这就遇到了CROSS APPLY 和MERGE的语法,两者之前完全没接触过。 所以专门查了下SQL Server2008实战。

1、CROSS APPLY

从教程和数据查询结果来看CROSS APPLY完全是属于语法糖,下面是我基于AdventrueWorkR2查询的,使用了CROSS APPLY和INNER JOIN两种方式。

USE [AdventureWorks2008R2]
GO
/****** Object: UserDefinedFunction [dbo].[fn_WorkOrderRouting] Script Date: 08/13/2015 13:16:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_WorkOrderRouting]
(@WorkOrderID int) RETURNS TABLE
AS
RETURN
SELECT a.WorkOrderID,a.ProductID,a.OperationSequence,a.LocationID
FROM Production.WorkOrderRouting a
WHERE a.WorkOrderID=@WorkOrderID

  

select w.WorkOrderID,w.OrderQty,r.ProductID,r.OperationSequence
from Production.WorkOrder w
CROSS APPLY dbo.fn_WorkOrderRouting(w.WorkOrderID) as r
ORDER BY w.WorkOrderID,w.OrderQty,r.ProductID

  

SELECT a.WorkOrderID,a.OrderQty,b.ProductID,b.OperationSequence FROM
Production.WorkOrder a
INNER JOIN Production.WorkOrderRouting b on a.WorkOrderID= b.WorkOrderID
ORDER BY a.WorkOrderID,a.OrderQty,b.ProductID

 

2、MERGE

merge简单来说是针对插入、更新、删除三个操作的合并,根据与源表联结的结果,对目标表进行插入、更新、删除。 我们经常用的场景也就是主从表同步,或者是主表和历史表的同步和维护。 下面代码片段是我在网上看到的一段:

--创建一个临时的订单表
CREATE TABLE Orders(OrderID INT,CustomerID NCHAR(5))
GO
--往这个表中添加两行记录
INSERT INTO Orders VALUES(1,N'AAAAA')
INSERT INTO Orders VALUES(2,N'BBBBB')
GO
--通过生成表查询,产生另外一个架构一模一样的表,但只是复制了第一行数据过去
SELECT * INTO Orders2 FROM Orders WHERE OrderID=1
GO
--将第二个表的数据进行更新
UPDATE orders2 SET CustomerID=N'DDDDD'
--合并两个表
MERGE Orders o
USING Orders2 o2 ON o2.OrderID=o.OrderID
WHEN MATCHED THEN UPDATE SET O.CustomerID=o2.CustomerID--如果匹配到了,就更新掉目标表
WHEN NOT MATCHED THEN INSERT VALUES(o2.OrderID,o2.CustomerID)--如果匹配不到,就插入
WHEN NOT MATCHED BY SOURCE THEN DELETE;--如果来源表无法匹配到,就删除

  

T-SQL CROSS APPLY、MERGE的更多相关文章

  1. SQLServer中的Cross Apply、Outer Apply

    https://www.2cto.com/database/201304/206330.html

  2. SQL 关于apply的两种形式cross apply 和 outer apply, with cube 、with rollup 和 grouping

    1). apply有两种形式: cross apply 和 outer apply先看看语法: <left_table_expression> {cross|outer} apply &l ...

  3. SQL Server 2008 R2——CROSS APPLY 根据数据出现的次数和时间来给新字段赋值

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  4. SQL Server中CROSS APPLY和OUTER APPLY应用

    1.什么是Cross Apply和Outer Apply ? 我们知道SQL Server 2000中有Cross Join用于交叉联接的.实际上增加Cross Apply和Outer Apply是用 ...

  5. SQL Server中CROSS APPLY和OUTER APPLY的应用详解

    SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能.新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行.它不像JOIN那样先计算那个表表达式都可以, ...

  6. SQL 关于apply的两种形式cross apply 和 outer apply(转)

    转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...

  7. SQLServer count函数、cross apply和outer apply、

    1.COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)2.COUNT(*) 函数返回表中的记录数 select *   from TABLE_1 T1 outer ap ...

  8. SQL 关于apply的两种形式cross apply 和 outer apply

    SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...

  9. SQL关于apply的两种形式cross apply和outer apply(转载)

    SQL 关于apply的两种形式cross apply 和 outer apply   apply有两种形式: cross apply 和 outer apply   先看看语法:   <lef ...

随机推荐

  1. jquery 回到顶部,简洁大方

    效果

  2. JAVA笔试题集(一)--JAVASE部分

    红色答案为参考答案 1.从下列选项中选择正确的Java表达式(多选) A.  int k=new String("aa");       B.  String str=String ...

  3. java多态性,父类引用指向子类对象

    父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...

  4. Expert 诊断优化系列------------------透过等待看系统

    上一篇我们简单的介绍了,语句优化的三板斧,大部分语句三板斧过后,就算不成为法拉利也能是个宝马了.为了方便阅读给出系列文章的导读链接: SQL SERVER全面优化-------Expert for S ...

  5. JS原型继承和类式继承

    前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...

  6. Silverlight及WPF中实现自定义BusyIndicator

    在开发Silverlight或者WPF项目时,当我们调用Web服务来加载一些数据时,由于数据量比较大需要较长的时间,需要用户等待,为了给用户友好的提示和避免用户在加载数据过程中进行重复操作,我们通常使 ...

  7. SQL Server 权限管理

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/权限控制/管理/分配/登入名/数据库用户/角色 概述 对数据库系统而言,保证数据的安全性永远都是最重要的问题之一.一个好的数据库环 ...

  8. 玩转动态编译 - 高级篇:二,IL设置静态属性,字段和类型转换

    静态属性赋值 先来看 Reflector反射出的IL源码(感谢Moen的提示),这次用 Release模式编译,去掉那些无用的辅助指令 public void AAA(string s) { MyCl ...

  9. (转)webHttpBinding、basicHttpBinding和wsHttpBinding区别

      (1)webHttpBinding与basicHttpBinding / wsHttpBinding的区别: webHttpBinding is the REST-style binding, w ...

  10. zookeeper分布式锁实现

    1.定义分布式锁接口 package com.ljq.lock; import java.util.concurrent.TimeUnit; public interface DistributedL ...