忽略INSERT SELECT语句中的中间列的方法?

时间:2012-02-21 21:40:04

标签: tsql

对于insert ... select语句,有没有办法忽略select语句所需但应插入的变量?

我正在使用rank函数选择要insert的数据。遗憾的是,无法在where子句中调用rank函数。

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 INSERT的选择列表   语句包含的项目多于插入列表。的数量   SELECT值必须与INSERT列的数量匹配。

我知道我可以使用临时表来执行此操作,但如果可能的话,我希望将其保留在单个语句中。

1 个答案:

答案 0 :(得分:4)

将主查询包装在子查询中。

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;