INSERT INTO с помощью SELECT и увеличения значения в столбце

Я пытаюсь вставить недостающие строки в таблицу. Один из столбцов — 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  

person mheptinstall    schedule 23.02.2012    source источник


Ответы (2)


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

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

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

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

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

INSERT INTO SPOL (sID, oID)
SELECT sID, oID,
FROM   TMPO
WHERE  OrderNumber IS NOT NULL
person Bridge    schedule 23.02.2012
comment
Нет, я не могу изменить схему. Мы надеемся, что это должен быть одноразовый запрос на вставку для тех, которые отсутствуют. - person mheptinstall; 23.02.2012

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

person Teju MB    schedule 23.02.2012
comment
хорошо, сэр tombom., буду учиться ..! Лучше вам сосредоточиться на содержании, а не презентации. - person Teju MB; 24.02.2012