用幾個例子解釋這個會更清晰。
比如: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。位址可以是陣列下標,索引,或記憶體位址等 衝突 雜湊函式可能會把兩個和兩個以上的不同關鍵字對映到同一位址。衝突不可避免,所以要設計好的處理衝突的方法。同義詞 發生碰撞的不同關鍵字為同義詞。雜湊表 根據關鍵...