zoukankan      html  css  js  c++  java
  • T-SQL中的APPLY用法

     上周和team leader 讨论问题的时候,

    发现自己连 sqlserver 中的 apply  都不会用,赶快,今天来恶补一哈;

    sql 脚本准备;

    IF object_id('dbo.Product') IS NOT NULL  
        DROP TABLE dbo.Product;  
    IF object_id('dbo.SearchString') IS NOT NULL  
        DROP TABLE dbo.SearchString;  
    IF object_id('dbo.FindProductLike') IS NOT NULL  
        DROP FUNCTION dbo.FindProductLike;  
       
    CREATE TABLE dbo.Product  
        (  
          ID INT IDENTITY ,  
          ProductNameVARCHAR(100) ,  
          Price MONEY  
        );  
    INSERT  INTO dbo.Product  
    VALUES  ( 'Red SantaSuit', 199.99 ),  
            ( 'Candy Canes', 1.99 ),  
            ( 'Fake Snow', 2.99 ),  
            ( 'Red Bells', 49.99 ),  
            ( 'LED Lights', 6.99 );  
       
    CREATE TABLE dbo.SearchString  
        (  
          ID INT IDENTITY ,  
          String VARCHAR(100)  
        );  
       
    INSERT  INTO dbo.SearchString  
    VALUES  ( 'Red' ),  
            ( 'Lights' ),  
            ( 'Star' );  
    GO  

    还记得模糊查询吧,如果,我们定义查询的关键字为:

    Red
    Lights
    Star

      我们的sql可能会这么写;

      SELECT * FROM Product WHERE ProductName LIKE '%' + 'Red' + '%'
    
      SELECT * FROM Product WHERE ProductName LIKE '%' + 'Lights' + '%'
    
      SELECT * FROM Product WHERE ProductName LIKE '%' + 'Star' + '%'

     当然 你可以可以 用多个 or 或者uion all 来 或者,动态sql 来拼接;

    然后如果我增加,更过多的关键字呢,然后...........

    我们可以考虑这样做;建立一个ForSearch表,然后....

    CROSS APPLY 就出场啦,

    它会对相关联的每一行都应用该函数;

    我们先建立一个函数

    CREATE FUNCTION SEARCHINFO
    (
    
       @KEYWORD VARCHAR(100)
    )
    RETURNS TABLE  ---这里是我们的returns ---不是 return 多了个s
    AS
    RETURN (
             SELECT ProductName,
                    Price
             FROM   Product
             WHERE  ProductName like '%' + @KEYWORD +'%'
    )
    GO

    然后我们将该函数,应用到  SearchString 表中的  String 字段中的,每一个值(行),并返回  于 SearchString 表相关联;

    SELECT * FROM SearchString AS S
    CROSS APPLY SEARCHINFO(S.String)

    结果:

    今后,我们就可以将要查询的关键字,存放在我们的  SearchString 表中,然后应用我们的 apply 和  SEARCHINFO 函数

     该操作符和CROSS APPLY的唯一区别是返回所有数据,包括没有匹配的值;

    也就是我们的Star 会别列出来,

    效果如图:

     我们也可以直接这样写:

    SELECT * FROM SearchString AS S
    CROSS APPLY 
    (
       SELECT ProductName, Price
       FROM Product
       WHERE ProductName like '%' + S.String + '%'
    ) AS X

    完美,再见,下班,回家

    参考文献:http://blog.csdn.net/dba_huangzj/article/details/48545951

    这边文章,基本是按照文献写的,但是看了之后,梳理思路,自己再写一遍,效果会很好滴呀;

  • 相关阅读:
    架构师养成记--19.netty
    架构师养成记--18.NIO
    架构师养成记--17.disrunptor 多生产者多消费者
    JS计算字符长度、字节数 -- 转
    BootStrap Modal 点击空白时自动关闭
    架构师养成记--16.disruptor并发框架中RingBuffer的使用
    架构师养成记--15.Disruptor并发框架
    架构师养成记--14.重入锁ReentrantLock 和 读写锁 ReentrantReadWriteLock
    049、Java中使用switch判断,不加入break时的操作
    048、Java中使用switch判断
  • 原文地址:https://www.cnblogs.com/mc67/p/7400563.html
Copyright © 2011-2022 走看看