• T-SQL CROSS APPLY、MERGE


    写在前面

                刚才看项目里一个存储过程,也是好长时间没有使用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;--如果来源表无法匹配到,就删除
    

      

  • 相关阅读:
    struts2配置文件详解
    实体类和数据库映射--配置文件
    Hibernate常用配置文件详解
    本地计算机上的OracleOraDb11g_home1TNSListener服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。——Oracle监听器服务无法启动!
    关于远程访问Oracle数据库的设置(共享数据库)
    Log4J日志配置详解
    Java compiler level does not match the version of the installed Java project facet.问题
    Genymotion出现Unable to load VirtualBox engine问题--100%解决
    eclipse注解——作者,创建时间,版本
    web工程下的html中引用其他目录下的文件的path
  • 原文地址:https://www.cnblogs.com/sword-successful/p/4727042.html
Copyright © 2020-2023  润新知