将表中的'n'个第一个元素插入另一个表格并将X-n插入到另一个表格SQL Server中

时间:2011-02-27 00:54:42

标签: sql-server-2008

如果我有一个带X寄存器的表,(这里是X = 6)

id field
--------
1  1232
2   346
3   349
4   465
5    68
6   545

如何在表格中插入n(n = 3)个第一个元素,然后将其余的X-n插入另一个

table1
id field
--------
1  1232
2   346
3   349


table2
id field
--------
1   465
2    68
3   545

2 个答案:

答案 0 :(得分:2)

With RankedItems As
    (
    Select id, field
        , Row_Number() Over ( Order By id ) As Num
    From Registers
    )
Insert Table1( id, field )
Select id, field
From RankedItems
Where Num <= 3

With RankedItems As
    (
    Select id, field
        , Row_Number() Over ( Order By id ) As NewId
    From Registers
    )
Insert Table2( id, field )
Select Num - 3, field
From RankedItems
Where Num > 3

答案 1 :(得分:1)

我不知道你是在寻找一种通用的方法,还是一种特定于你的场景的方法,但我们假设你正在寻找特定于你的场景的东西。

由于您的表似乎已连续增加列,我们可以使用:

INSERT INTO Table1
SELECT [ID], [Field]
  FROM [TableX]
 WHERE [ID] <= 3

INSERT INTO Table2
SELECT [ID] - 3, [Field]
  FROM [TableX]
 WHERE [ID] >= 4

但这确实是一个非常具体的答案。更一般地,有不同的方法从表中选择特定数量的行。例如,另一种方法是:

INSERT INTO Table1
SELECT TOP 3 [ID],[Field]
  FROM [TableX]
 ORDER BY [ID]

INSERT INTO Table2
SELECT TOP 3 [ID] - 3, [Field]
  FROM [TableX]
 ORDER BY [ID] DESC

另外,如果要插入的表的[id]列是标识列,那么您可以跳过插入它们并让identity识别为[id]列分配值,例如:

INSERT INTO Table1 ([Field])
SELECT TOP 3 [Field]
  FROM [TableX]
 ORDER BY [ID]

INSERT INTO Table2 ([Field])
SELECT TOP 3 [Field]
  FROM [TableX]
 ORDER BY [ID] DESC

还有其他方法,但这些方法最简单。它们的适用性取决于您的具体情况。例如,如果你需要一个固定数量的行在table1和table2中(你特别想要3行),但是你在tableX中有重复的[id]值,那么第一种方法将无法工作(其中一个表将获得超过3行,而另一个表会少一些。)

我希望这会给你一些想法。顺便提一下,如果您担心[id]列的值可能存在间隙或重复,那么Thomas的方法非常出色。