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

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

时间: 2024-11-03 05:55:08

T-SQL中的APPLY用法的相关文章

SQL中if exists用法细节

用if exists建表[转] 1 判断数据库是否存在 Sql代码 if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名]  if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名] 2 判断表是否存在 Sql代码 if exists (select * from sysobjects w

SQL中MINUS的用法

minus指令是运用在两个 SQL 语句上.它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中.如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现.如果第二个 SQL 语句所产生的结果并没有存在于第一个 SQL 语句所产生的结果内,那这笔资料就被抛弃. MINUS 的语法如下: [SQL 语句 1] MINUS [SQL 语句 2] 我们继续使用一样的例子: Store_Information 表格 store_name  Sales  Date

linq to ef(相当于sql中in的用法)查询语句

select * from DoctorInfo doctor where doctor.HosDepartId in (select Id from HospitalDepartment hd where hd.DepartmentId=5) var a=from d in _entity.HospitalDepartment where d.DepartmentId==5 select d; List<int> lst=new List<int>();foreach(var b

sql中binary_checksum(*)的用法

sql中binary_checksum(*)的用法(转) binary_checksum(*)可以用来检查修改过的行. 同一行在update后,该行的binary_checksum(*)就不同. 如 select title_id,binary_checksum(*)  from titles where  title_id=1 时title_id=1 的该行的binaru_checksum(*) 的值为123456 若此时 update titles set title='ddd' where

SQL中的declare用法

平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c#中的局部变量,在if中如果我们定义一个变量的话他的作用到if结束为止,if外是不识别这个变量的,else里都不能使用,简单的写一下. if (true)            {                Int32 i = 1;                Console.WriteLine(i)

SQL中Truncate的用法

转自:http://www.studyofnet.com/news/555.html 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作.TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少.下面介绍SQL中Truncate的用法 当你不再需要该表时, 用 drop:当你仍要保留该表,但要删除所有记

SQL中Truncate的用法(转)

转自:http://www.studyofnet.com/news/555.html 本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作.TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少.下面介绍SQL中Truncate的用法 当你不再需要该表时, 用 drop:当你仍要保留该表,但要删除所有记

SQL中CASE 的用法 转载

sql语言中有没有类似C语言中的switch case的语句?? 没有,用case   when   来代替就行了.              例如,下面的语句显示中文年月 select getdate() as 日期,case month(getdate()) when 11 then '十一' when 12 then '十二' else substring('一二三四五六七八九十', month(getdate()),1) end+'月' as 月份 ===================

T-SQL中的APPLY用法(半翻译)

本文接上文:T-SQL 中的CROSS JOIN用法(半翻译) 同样可用于微软认证70-461: Querying Microsoft SQL Server 2012考试的学习中. ---------------------------------------------------------------------以下为译文----------------------------------------------------------------------- 原文出处:http://w