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