因為某些原因,前陣子從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
留言列表