INSERT INTO с помощью SELECT и увеличения значения в столбце - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь вставить недостающие строки в таблицу.Один из столбцов - OrderNumber (номер сортировки), этот столбец должен быть +1 от максимального значения OrderNumber, возвращаемого для sID в таблице.Некоторые sIDs не отображаются в таблице SPOL, поэтому в конце оператора есть предложение WHERE.Я бы снова запустил этот оператор, но установил OrderNumber в 1 для записей, где sID в данный момент не существует в таблице.

Приведенный ниже оператор не работает из-за OrderNumber, вызывающего проблемыпервичный ключ sID + OrderNumber.

Как получить увеличение OrderNumber для каждой строки, вставленной на основе столбца sID?

INSERT INTO SPOL(sID, OrderNumber, oID)
   SELECT           
      sID, OrderNumber, oID
   FROM
      (SELECT 
           sID, 
           (SELECT Max(OrderNumber) + 1
            FROM SPOL
            WHERE sID = TMPO.sID) AS OrderNumber, 
           oID
       FROM TMPO
       WHERE NOT EXISTS (SELECT * FROM SPOL
                         WHERE SPOL.oID = TMPO.oID)
      ) AS MyData
   WHERE
       OrderNumber IS NOT NULL  

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

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

Вы можете установить для свойства Identity значение on для столбца OrderNumber в студии управления SQL Server, но сценарий, который будет генерировать, клонирует таблицу с новой спецификацией, вставляет значения, которые вы уже получили при включенном Identity_Insert, удаляет оригинал table, и переименовывает временную для ее замены - это приводит к огромным накладным расходам в зависимости от того, сколько у вас строк.

Наиболее эффективный способ это сделать, вероятно:

  1. создать дополнительный столбец со свойством identity на
  2. копирование значений
  3. переименовать исходный столбец
  4. переименовать новый столбец с тем же именем, что и исходный
  5. удалить исходный столбец OrderNumber

Как только это сделано, это сделано, хотя - и заботится о себе. Вы не предпочли бы, чтобы ваша инструкция вставки просто сказала что-то вроде этого:

INSERT INTO SPOL (sID, oID)
SELECT sID, oID,
FROM   TMPO
WHERE  OrderNumber IS NOT NULL
0 голосов
/ 23 февраля 2012

Используйте идентификатор (1,1) для увеличения номера заказа вашего столбца, это облегчит вашу задачу ..!

...