Оператор INSERT INTO, который копирует строки и автоматически увеличивает столбец идентификатора ключа без идентификатора - PullRequest
9 голосов
/ 12 мая 2010

Учитывая таблицу, которая имеет три столбца

  1. ID (первичный ключ, без автоинкрементации)
  2. GroupID
  3. SomeValue

Я пытаюсь написать одну инструкцию SQL INSERT INTO, которая сделает копию каждой строки с одним GroupID в новом GroupID.

Пример начальной таблицы:

ID | GroupID | SomeValue
------------------------
1  |    1    |    a
2  |    1    |    b

Цель после выполнения простого оператора INSERT INTO:

ID | GroupID | SomeValue
------------------------
1  |    1    |    a
2  |    1    |    b
3  |    2    |    a
4  |    2    |    b

Я думал, что смогу сделать что-то вроде:

INSERT INTO MyTable
(       [ID]
       ,[GroupID]
       ,[SomeValue]
)
(
SELECT (SELECT MAX(ID) + 1 FROM MyTable)
       ,@NewGroupID
       ,[SomeValue]
 FROM MyTable
 WHERE ID = @OriginalGroupID
)

Это вызывает нарушение PrimaryKey, поскольку в конечном итоге оно будет использовать одно и то же значение Max (ID) +1 несколько раз, как кажется.

Является ли мое единственное обращение к группе операторов INSERT в операторе T-SQL WHILE с возрастающим значением Counter?

У меня также нет возможности превратить идентификатор в столбец идентификатора с автоинкрементным увеличением, поскольку это может привести к нарушению кода, для которого у меня нет источника.

Ответы [ 3 ]

11 голосов
/ 12 мая 2010

Вместо + 1 добавьте номер строки. Я также исправил ошибку в предложении WHERE (должно быть GroupID =, а не ID =):

INSERT INTO MyTable
(       [ID]
       ,[GroupID]
       ,[SomeValue]
)
(
    SELECT
       (SELECT MAX(ID) FROM MyTable) + ROW_NUMBER() OVER (ORDER BY GroupId),
       @NewGroupID,
       [SomeValue]
    FROM MyTable
    WHERE GroupID = @OriginalGroupID
)
1 голос
/ 12 мая 2010

Используйте это:

INSERT INTO MyTable
(       [ID]
       ,[GroupID]
       ,[SomeValue]
)    
 SELECT ROW_NUMBER() OVER() + X.MaxID 
       ,@NewGroupID
       ,[SomeValue]
 FROM MyTable
 CROSS JOIN (SELECT MAX(ID) AS MaxID FROM MyTable) X 
 WHERE GroupID = @OriginalGroupID
1 голос
/ 12 мая 2010
WITH    q AS
        (
        SELECT  *,
                (
                SELECT  MAX(id)
                FROM    mytable
                ) + ROW_NUMBER() OVER () AS nid
        FROM    mytable
        WHERE   groupID = 1
        )
INSERT
INTO    mytable (id, groupid, somevalue)
SELECT  nid, 2, somevalue
FROM    q
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...