国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

根據(jù)上一行填充本行的空白欄位,SQL處理方式

2024-07-21 02:47:51
字體:
供稿:網(wǎng)友
根據(jù)上一行填充本行的空白欄位,SQL處理方式

我在4年多前,寫了一篇Excel處理空白Cell的文章,http://www.cnblogs.com/studyzy/archive/2010/04/07/1706203.html,其實在數(shù)據(jù)庫中也會遇到這種情況。對于普通的OLTP系統(tǒng)來說,應(yīng)該不會出現(xiàn),主要是在做OLAP,導(dǎo)入外部數(shù)據(jù)源時,可能導(dǎo)入系統(tǒng)的就是帶有空白記錄的數(shù)據(jù)。

為了方便說明,我舉了一個簡單的例子,假設(shè)一個學(xué)生成績表,有字段“學(xué)生ID”和“成績”,學(xué)生ID是主鍵,自增,成績只有NULL和1,2,3,4,5這幾個值。在錄入學(xué)生成績的時候,如果成績?yōu)镹ULL,就表示該學(xué)生成績和上一個學(xué)生的成績相同。現(xiàn)在要查詢某個學(xué)生ID的成績,該怎么查呢?或者要將成績字段改為不允許為空,怎么把所有NULL的行填上成績呢?

首先我們先建立示例表:

1createtablet12(3IDintidentityPRimarykey,4Scoreintnull5);6insertt17values(3),(4),(null),(3),(null),(null),(5);89select*10fromt1

NewImage

從結(jié)果我們可以看到如果要查詢學(xué)生6的成績,那么應(yīng)該先去查學(xué)生5的成績,由于學(xué)生5也是空,所以要繼續(xù)查前一個學(xué)生4的成績,得到分數(shù)3,所以學(xué)生6的成績是3.這顯然是一個遞歸問題,如果一直是空,會繼續(xù)遞歸下去,直到找到一個成績?yōu)橹埂R赟QL中使用遞歸,那么第一個應(yīng)該想到的就是公用表表達式CTE。關(guān)于CTE的語法和說明可以看MSDN:https://msdn.microsoft.com/zh-cn/library/ms186243.aspx

那么我們這里遞歸的終點是什么呢?是不為空的成績,遞歸的鏈接條件是上一個學(xué)生ID=當前學(xué)生ID-1.于是我們可以將此次的公用表表達式寫為:

1witht2as3(4select*fromt1whereScoreisnotnull5unionall6selectt1.ID,t.Score7fromt8innerjoint19ont.ID+1=t1.ID10wheret1.Scoreisnull11)12select*13fromt14orderbyID;

得到的結(jié)果為:

NewImage

這里的情況比較特殊ID是連續(xù)的,那么如果ID不連續(xù)會怎么樣呢?我們試著刪除ID=5

delete fromt1whereID=5

這個時候如果還是運行上面的CTE就會查不到ID=6的記錄,因為inner join的條件不成立了。那么簡單的辦法就是使用開窗函數(shù)給每一行數(shù)據(jù)增加一列連續(xù)自增的列,SQL Server中的函數(shù)是ROW_NUMBER().這樣就變成了兩個CTE嵌套使用,請看代碼:1witht1new2as3(4select*,ROW_NUMBER()over(orderbyID)asRowNo5fromt16)7,t8as9(10selectId,Score,RowNofromt1newwhereScoreisnotnull11unionall12selectt1new.ID,t.Score,t1new.RowNo13fromt14innerjoint1new15ont.RowNo+1=t1new.RowNo16wheret1new.Scoreisnull17)1819select*20fromt21orderbyIDNewImage

公用表表達式真的很強大,另外在使用View出Report的時候,也可以用CTE,因為在View中不能用臨時表,所以使用CTE代替臨時表是個不錯的解決方案。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 高要市| 儋州市| 台州市| 米易县| 广饶县| 田林县| 措勤县| 涞水县| 宣威市| 白银市| 留坝县| 沂南县| 栾城县| 郁南县| 韩城市| 丹东市| 杨浦区| 河池市| 洪江市| 武清区| 灵石县| 霍林郭勒市| 马鞍山市| 兰考县| 奉新县| 靖江市| 克什克腾旗| 郑州市| 阳新县| 龙门县| 徐水县| 定陶县| 水富县| 柘城县| 平度市| 贵阳市| 托克逊县| 石楼县| 卓资县| 塔城市| 涡阳县|