2011-12-29 85 views
3

我有完全相同的定義2表:t2和t1。如何從table1中選擇500行並將它們插入到table2中?

t2有1000行,t1完全是空的。

如何從t2中選擇top 500行並將它們插入t1?

+3

爲什麼你想從一個完全空表中選擇TOP 500行???你說* t1是完全空白的*然後*我如何從t1中選擇500行* * - 根本沒有任何意義...... – 2011-12-29 13:37:44

+1

感謝您發現它;我已經修復了問題文本 – pencilCake 2011-12-29 13:41:43

+0

另外:正如gbn正確地指出:如果沒有'ORDER BY',你的'TOP 500'會給你一個任意的500行......所以你想要'TOP 500' **標準?? – 2011-12-29 13:42:09

回答

11

我會用 「emptyTable」 和 「populatedTable」,因爲問題是混亂

重要沒有ORDER BY的TOP會給出500個任意行。從未有一個隱含的或自然順序表

INSERT INTO emptyTable 
SELECT TOP 500 * 
FROM populatedTable 
ORDER BY What -- need this to define TOP 500 

缺乏此列列表通常被定義爲壞的做法,但只能當

  • 表是相同
  • 沒有在emptyTable IDENTITY列

編輯:

ORDER BY是要求以保證行順序。看到這些。這也是在ANSI標準

+0

+1 ORDER BY的優點 - 沒有ORDER BY的TOP(x)'只給出隨機行。 – 2011-12-29 13:39:14

+0

據我所知,如果沒有連接,查詢優化器將按照物理順序(即聚集索引的順序,如果存在的話) – 2011-12-29 13:45:04

+1

@RowlandShaw:有這樣的巧合,但不要依賴它 – gbn 2011-12-29 13:46:07

5

事情是這樣的:

INSERT INTO t1 
SELECT TOP 500 * FROM t2 

您選擇的500強,並插入。

+3

其實,@marc_s,他說t1是空的,所以我假設他希望他們去那裏。另外:是的,我忘了'*' – 2011-12-29 13:37:17

+0

@marc_s不太確定,因爲他們還說t1沒有行(所以沒有第一個500) – 2011-12-29 13:37:33

3
insert t2(fieldslist) 
select top 500 fieldslist from t1 
2

如果兩個表具有相同的架構,它是那樣簡單:

INSERT INTO t1 
SELECT TOP 500 * 
FROM t2 
+0

@marc_s據我所知,沒有連接,查詢優化器將與物理順序一致(即聚集索引的順序,如果存在的話) – 2011-12-29 13:43:51

+0

否 - 那個*可能是現在和現在的情況 - 但是沒有ORDER BY,**沒有**保證關於什麼順序將被使用 - 它不是確定性的 - 在SQL Server中沒有自然的ORDER ** – 2011-12-29 13:50:06

相關問題