zoukankan      html  css  js  c++  java
  • SQLSERVER 之APPLY用法

    首先 APPLY 分为 OUTER APPLY 和CROSS APPLY

    使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。

    APPLY 有两种形式: CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。

    例一:

    现在有一个订单表和一个客户表

    CREATE TABLE USERS(
    USERID INT  PRIMARY KEY IDENTITY(1000,1),
    USERNAME VARCHAR(10) NULL,
    USERSEX BIT NULL
    )
    CREATE TABLE USERSORDER(
    ORDERSID INT  PRIMARY KEY IDENTITY(1,1),
    ORDERNAME VARCHAR(100) NULL,
    ORDERCOMMIT VARCHAR(1000),
    USERORDERID INT,
    ORDERMONEY MONEY
    )
    
    SELECT * FROM USERS
    SELECT * FROM USERSORDER
    INSERT INTO USERS VALUES('小明',0),('毛阿敏',1),('李白',0),('程普',0)
    INSERT INTO USERSORDER VALUES('伊斯兰狗*1','乖巧可爱',1000,7000),('加菲猫','乖巧可爱',1002,10000),('九尾狐狸*1','乖巧可爱',1000,5000),('小鸟依人','乖巧可爱',1000,9000),('啧啧啧*1','哒哒哒',1001,9000)

    使用 OUTER APPLY试验

    SELECT * FROM USERS A OUTER APPLY(SELECT * FROM USERSORDER U WHERE A.USERID=U.USERORDERID)AS Q

     

    使用 CROSS APPLY试验

    SELECT * FROM USERS A CROSS APPLY(SELECT * FROM USERSORDER U WHERE A.USERID=U.USERORDERID)AS Q

     

     例二:

    -- 创建test表
     create   table  test(oid  int ,name  char ( 20 ),lead  char ( 10 ))
    
     -- 往里面插入几行数据
     insert   into  test  values ( 1 , ' 测试公司 ' , ' 11 ' )
     insert   into  test  values ( 1 , ' 测试公司 ' , ' 12 ' )
     insert   into  test  values ( 1 , ' 测试公司 ' , ' 13 ' )
     insert   into  test  values ( 1 , ' 测试公司 ' , ' 14,15,16 ' )
    
    
     -- 拆分字符串函数
     alter   function  select_Dempart_Manager
    (
     @oid   int ,
     @lead   char ( 10 )
    )
     returns   @temp   table (oid  int ,lead  char ( 10 ))
     as
     begin
        while   charindex ( ' , ' , @lead ) > 1
          begin
            insert   into   @temp   values ( @oid , left ( @lead , charindex ( ' , ' , @lead ) - 1 ))
            set   @lead = stuff ( @lead , 1 , charindex ( ' , ' , @lead ), '' )
          end
        insert   into   @temp   values ( @oid , @lead )   
     return
     end
    
     -- 使用apply函数调用
     select  a.oid,name,ST.lead  from  test a
     outer  apply select_Dempart_Manager(a.oid,a.lead)  as  ST
    
     -- 结果
    -- oid name                    lead
    -- 1    测试公司               11        
    -- 1    测试公司               12        
    -- 1    测试公司               13        
    -- 1    测试公司               14        
    -- 1    测试公司               15        
    -- 1    测试公司               16        

    参考:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms175156(v=sql.105)

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/superfeeling/p/15605996.html
Copyright © 2011-2022 走看看