Sql Server中Cross Apply關(guān)鍵字的使用 詳解
Sql Server中Cross Apply關(guān)鍵字的使用
前言
在寫(xiě)一個(gè)業(yè)務(wù)的時(shí)候,有1列數(shù)據(jù)如下:
車(chē)牌號(hào) |
---|
湘A00001/湘G00001 |
湘A00002/湘G00002 |
湘A00003/湘G00003/湘A8888888 |
湘A00004/湘G00004/湘A00001 |
我的查詢條件也是車(chē)牌號(hào),我會(huì)傳入如下參數(shù):
@PLATE_NO '湘A00003/湘G00003/湘A8888888'
我需要判斷我傳入的車(chē)牌號(hào)是否包含上面的列數(shù)據(jù),舉例上面的表為B表,那么B表列中的車(chē)牌號(hào),我的PLATE_NO參數(shù)需要包含里面所有的車(chē)牌號(hào)。
一個(gè)簡(jiǎn)單的包含關(guān)系,我會(huì)用拆分函數(shù)去拆分我傳入的參數(shù),然后去比對(duì)參數(shù)是否包含B表的車(chē)牌號(hào)。對(duì)于參數(shù)處理很簡(jiǎn)單,但是B表的多行,那么該如何去處理B表的列呢?
Cross Apply介紹
在 SQL Server 中,Cross Apply 關(guān)鍵字主要用于從一個(gè)表中獲取數(shù)據(jù),并對(duì)每一行數(shù)據(jù)應(yīng)用一個(gè)表值函數(shù),然后返回函數(shù)的結(jié)果。這個(gè)關(guān)鍵字允許你在右側(cè)的表達(dá)式中引用左側(cè)表的列。
Cross Apply 和 Inner Join 類似,只返回匹配的記錄。如果沒(méi)有匹配的記錄,那么就不會(huì)返回任何結(jié)果。
思路
首先肯定需要通過(guò)‘/’拆分獲得車(chē)牌號(hào)數(shù)據(jù),將湘A00003/湘G00003/湘A8888888變成如下格式
col |
---|
湘A00003 |
湘G00003 |
湘A8888888 |
那么B表該如何去實(shí)現(xiàn),它有多行數(shù)據(jù),多行數(shù)據(jù)如何拆分成一列。
代碼實(shí)現(xiàn)
首先我們需要有一個(gè)表值函數(shù)來(lái)拆分字符串:
CREATE FUNCTION dbo.SplitString ( @List NVARCHAR(MAX), @Delim NVARCHAR(255) ) RETURNS TABLE AS RETURN ( SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)') FROM ( SELECT x = CONVERT(XML, '<i>' + REPLACE(@List, @Delim, '</i><i>') + '</i>').query('.') ) AS a CROSS APPLY x.nodes('i') AS y(i) );
實(shí)現(xiàn)方式很多,我這里直接讓GPT生成了一個(gè),執(zhí)行上述代碼即可完成拆分函數(shù)創(chuàng)建,調(diào)用如下:
SELECT Item FROM dbo.SplitString('湘A00003/湘G00003/湘A8888888', '/');
對(duì)于B表的操作,就需要使用到Cross Apply
關(guān)鍵字了,我對(duì)每一行數(shù)據(jù)車(chē)票號(hào)進(jìn)行拆分操作,然后將數(shù)據(jù)存于臨時(shí)表,并去重處理。
SELECT DISTINCT split.col INTO #TEMP FROM B CROSS APPLY dbo.SplitString(車(chē)牌號(hào), '/') AS split;
拆分結(jié)果如下
col |
---|
湘A00001 |
湘G00001 |
湘A00002 |
... |
然后在進(jìn)行比對(duì)查詢
將參數(shù)存放在TEMP01
臨時(shí)表,將B表拆分的數(shù)據(jù)存于TEMP02
臨時(shí)表,然后使用CASE WHEN
以TEMP02
為主表判斷TEMP01
列是否存在與02中,不能存在則新建一列賦值為0
SELECT P.Item, CASE WHEN EXISTS ( SELECT 1 FROM TEMP01 WHERE Item = P.Item ) THEN 1 ELSE 0 END AS ISBOOL FROM TEMP02 P
結(jié)果如下,這里只是舉例子,主要是體現(xiàn)Cross Apply的作用。
總結(jié)
簡(jiǎn)單來(lái)說(shuō) Cross Apply 看作是 SQL Server 中的一個(gè)"循環(huán)"操作。對(duì)于你在左邊的表中的每一行數(shù)據(jù),Cross Apply 都會(huì)執(zhí)行一次右邊的查詢。我上述的操作就是多列數(shù)據(jù)使用實(shí)現(xiàn)Cross Apply循環(huán)拆分每行數(shù)據(jù)的車(chē)牌號(hào)列。
到此這篇關(guān)于Sql Server中Cross Apply關(guān)鍵字的使用 的文章就介紹到這了,更多相關(guān)Sql Server Cross Apply關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談mssql access數(shù)據(jù)庫(kù) top分頁(yè)方法
雙top法相比于not in和max法,就是可以傳入一條sql語(yǔ)句來(lái)生成分頁(yè)sql語(yǔ)句,也可多字段排序2013-10-10Oracle、MySQL和SqlServe三種數(shù)據(jù)庫(kù)分頁(yè)查詢語(yǔ)句的區(qū)別介紹
這篇文章主要介紹了Oracle、MySQL和SqlServe三種數(shù)據(jù)庫(kù)分頁(yè)查詢語(yǔ)句的區(qū)別介紹 的相關(guān)資料,需要的朋友可以參考下2016-05-05ACCESS數(shù)據(jù)庫(kù)的壓縮,備份,還原,下載,刪除的實(shí)現(xiàn)
ACCESS數(shù)據(jù)庫(kù)的壓縮,備份,還原,下載,刪除的實(shí)現(xiàn)...2006-08-08SQL Server使用row_number分頁(yè)的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了SQL Server使用row_number分頁(yè)的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2016-06-06sql server 2000阻塞和死鎖問(wèn)題的查看與解決方法
在實(shí)際引用當(dāng)中,數(shù)據(jù)庫(kù)阻塞和死鎖在程序開(kāi)發(fā)過(guò)程經(jīng)常出現(xiàn),下面通過(guò)介紹數(shù)據(jù)庫(kù)阻塞和數(shù)據(jù)庫(kù)死鎖,并提供查看和解決阻塞和死鎖的方法2014-01-01關(guān)于SQL Server中bit類型字段增刪查改的一些事
在 SQL Server中,用來(lái)處理判斷flag的字段,使用bit類型,下面這篇文章主要給大家介紹了關(guān)于SQL Server中bit類型字段增刪查改的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09