对于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列的数量匹配。
我知道我可以使用临时表来执行此操作,但如果可能的话,我希望将其保留在单个语句中。
答案 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;