2010-07-21 107 views
2

使用SQL Server 2008鴻溝SQL Server表INT塊

我想採取有11萬條記錄表,將它們劃分成50000塊的每個在保持原有的表,只是確保每個塊包含獨特記錄。 如果我爲第一批選擇50000條記錄,我如何保證我能得到下一個50000等等。

+1

是否源表有可用於以一致/可重複的順序對數據進行排序的列?事實上 - 你可以編輯你的問題來顯示錶格模式嗎? – 2010-07-21 14:06:36

+0

會不會做什麼的查詢是必要的,通過一個訂單,然後追加'LIMIT 0,50000'到第一「跑」,'LIMIT 50000,50000'到第二,等等,這樣的伎倆? – 2010-07-21 14:07:33

回答

4

使用排名功能,在特定的行數():

DECLARE 
    @From int 
,@Thru int 

-- Example here would be the second set 
SET @From = 50001 
SET @Thru = 100000 

SELECT <columns> 
from (select <columns>, row_number() over (order by <PrimaryKey>) Ranking 
     from MyTable) xx 
where Ranking between @From and @Thru 
1

我不知道爲什麼你要來,但這裏goes-

SELECT * FROM 
( 
SELECT *, ROW_NUMBER() OVER (ORDER BY yourKey) AS Num FROM YourTable 
) X WHERE x.Num BETWEEN 0 AND 49999 

那麼你會增加你的0和49,999通過編程方式(希望,如果你要這個超過11萬條記錄)或手動。

+0

「我不知道爲什麼你會想」 我同意這似乎是一個奇怪的事情對我來說也是如此。 – HLGEM 2010-07-21 14:11:23

+0

當我(很少!)需要更新非常大的表並且不想洪泛我的事務日誌時,我已經完成了這樣的技巧。 – 2010-07-21 14:58:30

3

嘗試NTILE(n),其中N =組塊的數量。既然你需要創建一個「塊」的表,你應該知道你有多少塊需要和NTILE將正常分裂的行爲您提供:

DECLARE @YourTable table (RowID int, RowValue varchar(5)) 
INSERT @YourTable VALUES (1,'A') 
INSERT @YourTable VALUES (2,'B') 
INSERT @YourTable VALUES (3,'C') 
INSERT @YourTable VALUES (4,'D') 
INSERT @YourTable VALUES (5,'E') 
INSERT @YourTable VALUES (6,'F') 
INSERT @YourTable VALUES (7,'G') 
INSERT @YourTable VALUES (8,'H') 
INSERT @YourTable VALUES (9,'I') 
INSERT @YourTable VALUES (10,'J') 
INSERT @YourTable VALUES (11,'K') 
INSERT @YourTable VALUES (12,'L') 

DECLARE @YourTable1 table (RowID int, RowValue varchar(5)) 
DECLARE @YourTable2 table (RowID int, RowValue varchar(5)) 
DECLARE @YourTable3 table (RowID int, RowValue varchar(5)) 
DECLARE @YourTable4 table (RowID int, RowValue varchar(5)) 
DECLARE @YourTable5 table (RowID int, RowValue varchar(5)) 

INSERT @YourTable1 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=1 


INSERT @YourTable2 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=2 

INSERT @YourTable3 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=3 


INSERT @YourTable4 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=4 


INSERT @YourTable5 
    SELECT 
     RowID, RowValue 
     FROM (SELECT 
        RowID, RowValue 
         ,NTILE(5) OVER(ORDER BY RowID) AS TableID 
        FROM @YourTable 
      ) dt 
     WHERE dt.TableID=5 

SELECT * FROM @YourTable1 
SELECT * FROM @YourTable2 
SELECT * FROM @YourTable3 
SELECT * FROM @YourTable4 
SELECT * FROM @YourTable5 

OUTPUT:

RowID  RowValue 
----------- -------- 
1   A 
2   B 
3   C 

(3 row(s) affected) 

RowID  RowValue 
----------- -------- 
4   D 
5   E 
6   F 

(3 row(s) affected) 

RowID  RowValue 
----------- -------- 
7   G 
8   H 

(2 row(s) affected) 

RowID  RowValue 
----------- -------- 
9   I 
10   J 

(2 row(s) affected) 

RowID  RowValue 
----------- -------- 
11   K 
12   L 

(2 row(s) affected)