程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 用一句SQL處理SQL中止號成績 推舉

用一句SQL處理SQL中止號成績 推舉

編輯:MSSQL

用一句SQL處理SQL中止號成績 推舉。本站提示廣大學習愛好者:(用一句SQL處理SQL中止號成績 推舉)文章只能為提供參考,不一定能成為您想要的結果。以下是用一句SQL處理SQL中止號成績 推舉正文


名詞說明   斷號:好比,持續生成的編號,因為某種操作(平日為刪除)後,發生不持續的編號,我們將這類不持續的編號稱為斷號。   例如,數據庫中有一個字段叫合同編號,正常格局為201106_011(表現2011年6月的第11個合同),那末它後面的一個合同編號應當為201106_10,前面的一個應當為201106_12,當我們刪除合同201106_011,就會湧現201106_010前面直接是201106_012,這類情形下叫做斷號。   傳統體系中,像這類斷號的情形很罕見,好比數據庫中的列為遞增類型,當刪除某行後,就會湧現斷號,而常常有客戶提出需求,不願望湧現斷號的情形。處理計劃平日就是,假如刪除某行數據,那末下次新增時,應當將斷號補齊。       成績很簡略,處理辦法也很簡略:       寫一個C#辦法,用來獲得下一筆記錄的編號:

public static int GetNextNumber(int[] iNumList)
{
int iTempStr = iNumList[0]; //用一個暫時變量保留上一筆記錄的編號
for (var i = 0; i < iNumList.Length - 1; i++)
{
if (i == 0)
{
iTempStr = iNumList[i];
}
//假如湧現斷號,則補齊斷號
if ((iNumList[i] - iTempStr) > 1)
{
return iTempStr + 1;
}
else
{
iTempStr = iNumList[i];
}
continue;
}
return iNumList[iNumList.Length - 1] + 1;
}

固然,這段代碼也能夠簡寫為以下情勢:

public static int GetNextNumber3(int[] iNumList)
{
for (int i = 0, j = 1; j < iNumList.Length - 1; i++, j++)
{
//假如湧現斷號,則補齊斷號
if ((iNumList[j] - iNumList[i]) > 1)
{
return iNumList[i] + 1;
}
}
return iNumList[iNumList.Length - 1] + 1;
}

測試代碼以下:

static void Main(string[] args)
{
int[] iNums = { 1, 2, 4, 5, 6, 9, 10 }; //刪除數組中的3,7,8,即3,7,8為斷號,下次新增時,願望發生的斷號為3
System.Console.WriteLine(BreakNumber.GetNextNumber3(iNums));
System.Console.WriteLine(BreakNumber.GetNextNumber(iNums));
}

運轉成果以下:      頭幾天再次接觸到這個成績,因為特別的場景,再用C#反而會增長開辟難度,假如設法主意經由過程SQL來處理成績:
建表及制作數據SQL:

CREATE TABLE testTable
(
Code int primary key
)

INSERT INTO testTable(Code) VALUES (1)
INSERT INTO testTable(Code) VALUES (2)
INSERT INTO testTable(Code) VALUES (3)
INSERT INTO testTable(Code) VALUES (4)
INSERT INTO testTable(Code) VALUES (5)
INSERT INTO testTable(Code) VALUES (6)
INSERT INTO testTable(Code) VALUES (7)
INSERT INTO testTable(Code) VALUES (8)
INSERT INTO testTable(Code) VALUES (9)
INSERT INTO testTable(Code) VALUES (10)

然後再異樣刪除第3、7、8行的數據,使這三行發生斷號:
DELETE FROM testTable WHERE Code in (3,7,8)
剖析:要發生連號,等於要讓Code這一列上持續的,也就是說往往兩行之間的Code相差為1
因為Code是從1開端的(從其他數字開端的也是同理盤算),即按Code從小到年夜排序號,Code為1的行應當為第一行,Code為10的行應當在第10行,即Code=行號,
既然如許,預覽數據以下:
刪除數據前的排號:        刪除數據後的排號:   很顯著發明,刪除數據前,Code=行號,刪除後Code不等於等號,而刪除數據後的第一行Code不等於行號的數據,等於第一個湧現斷號的數據,即為我們想要查詢的成果。   如是,假如數據庫中有斷號,則可以用以下語句直接查出斷號:      成果立現。   這段代碼還存在一個缺點,即此辦法公用來處置有斷號的情形,假如不存在斷號時,應當前往Max(RowNumber)+1。准確代碼應當以下:     至此,我明天要講的根本停止,此處借用了SQL2005的辦法row_number ,其他數據庫中也有相似的辦法,年夜家可以本身探索。   成績完整處理了嗎?年夜家可以發明,以上湧現了斷號的情形,都是從小開端補號,好比3,7,8同時為斷號,則補3。假設有客戶請求從年夜號開端補號(即3,7,8斷號時,補8呢),怎樣處置?   後面兩種經由過程C#辦法操作的就很輕易了,這裡重要說一下經由過程SQL處置的辦法:      那末再擴大一下,若何查出一切的斷號呢?   要完成這個功效,普通設法主意是將以後Code與上一行的Code停止比較,但因為能夠湧現持續斷號的情形(例如刪除 Code=7、8、9三行)。此時該若何處置呢?   我的處理辦法是,假設max(code)等於100,那末我先結構出100行(如何結構?數據庫中隨意找個行數年夜於100的表,select top 100就好了,假如沒有行數年夜於100的表,就結合查詢結構出100行吧),再用這一100行的行號分離和code停止比較,假如存在Code<>行號的,即該處為斷裂號,示例以下: 假定體系中曾經存在另外一張表A,它的總行數>max(Code),【注:固然,假如不存在如許的表,也能夠經由過程select 的方法結構出來】, 查詢一切斷號的SQL以下:         至此,成績停止,以上代碼的長處在於只用一個SQL語句,而不須要用存儲進程、用戶自界說函數或C#中的輪回,便可以處理各類斷號成績,固然為了機能方面還可以再做優化,在此不列出。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved