close

因為某些原因,前陣子從module team被轉到做server的team去了

性質差滿多的啦,幾乎是完全沒接觸過的領域

所以基本上我沒什麼概念就是...

 

不過專案還是得做嘛,就被分到了一些工作,最近開始要寫code了,我想這就是悲劇的開端

雖然我有survey了一陣子,不過似乎都沒survey到點上...

 

像是資料庫這東西,我只知道一些基本的select之類的語法,實戰經驗根本就是0

這次剛好被分到相關的工作,之前survey的時候沒有survey到這塊,實在是一個頭兩個大...

畢竟做在產品上,品質是一定要有的,我這水準實在...XD

當然我知道server一定會用到這個啦,現在惡補以後也會用到囉 

 

好杯,那就開始吧

語法什麼的我就不談了,寫些我覺得新學到的東西

 

首先是變數,在sql server裡面是可以宣告變數來使用的

使用declare來宣告local變數,比如說這樣:

declare @var1 int;

這就是一個型態是int,叫做@var1的變數

賦值的方式很簡單,用set

set @var1=1;

不過一般的情境都是從table拿值出來賦值,可以用select來做,大概可以這麼寫:

select @var1 = id from id_table where id = 1;

或是用set也可以:

set @var1 = (select id from id)table where id = 1)

順帶一提,如果說select沒有值的話,變數就會被設為null

 

第二個是ROW_NUMBER(),詳細可以參考 https://docs.microsoft.com/zh-tw/sql/t-sql/functions/row-number-transact-sql?view=sql-server-ver15

這個是可以分群和排序用的,這邊簡單記錄一下這次的用法

ROW_NUMBER()後面的OVER裡面可以接分群方式排序方式,這次是用他來刪除重複資料的

情境大概是說有個id_table會一直被更新,雖然每筆更新資料都會被記錄下來在tmp_table裡面,不過我們要濾掉tmp_table裡面舊的資料,在更新到id_tabled_table裡面

 

當然這裡就是用到兩個欄位:id和time

用ROW_NUMBER()的話,大概可以這麼寫:

declare @t table

{

    id int, time datetime

}

insert into @t(id, time)

select ROW_NUMBER() OVER( PARTITION BY id,  ORDERED BY time DESC) AS row, tmp.id AS id, tmp.time AS time

from tmp_table AS tmp 

where IdenityId > lastUpdated AND row = 1;

最後那個IdenityId > lastUpdated 只是說要避免用到前一次更新到的資料,不過其實這又是另一個技巧

就是給所有資料一個idenity的流水號,然後每次記錄下來這樣

PARTITION BY id 就是依照id分群,把id相同的資料排在一起

ORDERED BY time DESC 就是依照time的大小倒敘排,並且依照排序的順序給一個row的數字

所以最新的那一筆資料就會是row=1

把這個select存到另一個variable table裡面,再用他去更新id_table裡的資料就行了

 

當然這是一個方法,不過這次用的方法更巧妙一點

因為有些沒更新的id藥用insert的方式加入id_table,如果已經存在的話就必須用update的方式更新

這個大概就是要用join的方式用tmp_table去left join id_table,然後判斷資料存在和不存在

然後把這個判斷也設成一個欄位放在variable table裡面,分別去insert和update資料到id_table裡面

 

好吧大概先這樣,因為我也有點忘記實際的code了

上述只是憑印象寫的XD

如果說之後有想到再回來補吧XD

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()