SQL Server APPLY表運算子

2021-06-18 16:00:47 字數 2660 閱讀 4836

用幾個例子解釋這個會更清晰。

比如:largetable表中的某一列儲存的資料是以「:」號分隔的資料,我們處理的時候,可能要先把這個值,先分隔,然後把分隔後的每個值單獨一行放在一張表中,然後對這個表做處理。

為了簡單,我們先拿其中id=2的一行處理,這些以:號分隔的資料,可能是我們某張表的主鍵(t1),我們可能需要把這些數值提出來,放在一張臨時表中,和t1表關聯,做一些處理。

處理這個分隔的資料結果如下圖:

如果用之前的版本處理這個操作的話,應該很發雜,暫時沒想到怎麼處理,如果有人實現過,可以提示一下。

這只是用其中一行做的處理,如果我們用上圖的3行都做這樣處理,把三行以:號分隔的數值都放在乙個表中,該怎麼處理呢?

select

a from

dbo.largetable 

aslt    

--實際表

cross':

')    

--自定義

錶值函式,處理以某個字元分隔的資料,把這些資料,返回一張表

where

a <>

''--

去掉結果表中a欄位為空的資料

處理的結果如下圖:

是不是很簡單。

需要額外定義的就是那個自定義錶值函式(split),這是我在網上找的,類似.net中split操作,**如下:

使用方法:select * from dbo.split('581::579::519::279::406::361::560',':')

*/alter

function

[dbo].

[split](

@sql

varchar

(8000

),@splits

varchar

(10

))returns

@temp

table

(a varchar

(100

))asbegin

declare

@iint

set@sql

=rtrim

(ltrim

(@sql

))set@i=

charindex

(@splits

,@sql

)while

@i>=

1

begin

insert

@temp

values

(left

(@sql,@i

-1

))set@sql

=substring

(@sql,@i

+1

,len

(@sql)-

@i)set@i

=charindex

(@splits

,@sql

)end

if@sql

<>

''insert

@temp

values

(@sql

)return

end

場景:有個供貨商表(supplier)和供貨商產品表(products),我們要取每乙個供貨商中單價最高的兩個產品。

供貨商表:

供貨商產品表:

首先,我們建立乙個自定義錶值函式(dbo.fn_top_products),該函式根據供貨商id返回單價最高的兩個商品。

object_id('

dbo.fn_top_products') 

isnot

null

drop

function

dbo.fn_top_products;

go--

根據供貨商id獲得單價最高的兩件商品

create

function

dbo.fn_top_products

(@supid

asint

)returns

table

asreturn

select

top(

2

)id 

asproductid,productname,unitprice

from

dbo.products

where

supplierid 

=@supid

order

byunitprice 

descgo

執行以下語句:

select

s.id 

assupplierid,s.companyname,unitprice 

from

dbo.supplier ass

outerasp

執行結果如下:

注意最後為null的記錄,reed公司因為沒有商品,所以單價為null了。

select

s.id 

assupplierid,s.companyname,unitprice 

from

dbo.supplier ass

crossasp

生成的輸出結果如下:

SQLServer APPLY表運算子使用介紹

用幾個例子解釋這個會更清晰。比如 largetable表中的某一列儲存的資料是以 號分隔的資料,我們處理的時候,可能要先把這個值,先分隔,然後把分隔後的每個值單獨一行放在一張表中,然後對這個表做處理。原始資料 largetable表 為了簡單,我們先拿其中id 2的一行處理,這些以 號分隔的資料,可...

MySql 表 建立表 刪除表 修改表

一 建立表 建立表語法 create table table name field1 datatype,field2 datatype,field3 datatype character set 字符集 collate 校驗規則 engine 儲存引擎 預設儲存引擎 mysql create tab...

Hash表(雜湊表 雜湊表)

雜湊函式 乙個把查詢表中的關鍵字對映成該關鍵字對應的位址的函式,記為hash key addr。位址可以是陣列下標,索引,或記憶體位址等 衝突 雜湊函式可能會把兩個和兩個以上的不同關鍵字對映到同一位址。衝突不可避免,所以要設計好的處理衝突的方法。同義詞 發生碰撞的不同關鍵字為同義詞。雜湊表 根據關鍵...