SQLServer APPLY表運算子使用介紹

2021-06-19 07:45:23 字數 1758 閱讀 3026

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

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

原始資料(largetable表):

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

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

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

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

處理的結果如下圖:

是不是很簡單。

需要額外定義的就是那個自定義錶值函式(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))

as begin

declare @i int

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返回單價最高的兩個商品。

複製** **如下:

if object_id('dbo.fn_top_products') is not null

drop function dbo.fn_top_products;

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

create function dbo.fn_top_products

(@supid as int)

returns table

as return

select top(2)id as productid,productname,unitprice

from dbo.products

where supplierid = @supid

order by unitprice desc

go 執行結果如下:

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

生成的輸出結果如下:

詳細出處參考:

SQL Server APPLY表運算子

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

MySql 表 建立表 刪除表 修改表

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

Hash表(雜湊表 雜湊表)

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