способ игнорировать промежуточный столбец в инструкции INSERT SELECT? - PullRequest
3 голосов
/ 22 февраля 2012

Для оператора insert ... select есть ли способ игнорировать переменную, которая требуется для оператора select, но должна быть вставлена?

Я использую функцию rank, чтобы выбрать, какие данные insert. К сожалению, функция rank не может быть вызвана в предложении where.

insert into target_table(v1
                        ,v2
                        ,v3
                        )
select v1
      ,v2
      ,v3
      ,RANK() over (partition by group_col
                    order by order_col desc
                   ) as my_rank
from source_table
where my_rank > 1

Результатом является следующая ошибка:

Сообщение 121, Уровень 15, Состояние 1, Строка 1 Список выбора для ВСТАВКИ Оператор содержит больше элементов, чем список вставки. Номер Значения SELECT должны соответствовать количеству столбцов INSERT.

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

1 Ответ

4 голосов
/ 22 февраля 2012

Оберните ваш основной запрос внутри подзапроса.

INSERT INTO target_table
    (v1, v2, v3)
    SELECT q.v1, q.v2, q.v3
        FROM (SELECT v1, v2, v3, 
                     RANK() OVER (PARTITION BY group_col ORDER BY order_col DESC) AS my_rank
                  FROM source_table) q
        WHERE q.my_rank > 1;

Для SQL Server 2005+ вы также можете использовать CTE :

WITH cteRank AS (
    SELECT v1, v2, v3, 
           RANK() OVER (PARTITION BY group_col ORDER BY order_col DESC) AS my_rank
        FROM source_table
)
INSERT INTO target_table
    (v1, v2, v3)
    SELECT v1, v2, v3
        FROM cteRank
        WHERE my_rank > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...