国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 临安市| 泸溪县| 休宁县| 苏州市| 志丹县| 凤凰县| 温宿县| 罗城| 察哈| 邹城市| 都兰县| 南通市| 泰和县| 紫阳县| 安塞县| 普格县| 宣威市| 蓝田县| 鄂州市| 江西省| 四平市| 南充市| 双桥区| 平湖市| 宜川县| 措美县| 宽甸| 深水埗区| 宜章县| 汉阴县| 疏勒县| 乌审旗| 安义县| 上犹县| 霍邱县| 淮北市| 舟曲县| 永安市| 渭源县| 额济纳旗| 乌恰县|