对于 insert ... select
语句,有没有办法忽略 select 语句所需但应该插入的变量?
我正在使用 rank
函数来选择要插入
的数据。不幸的是,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
结果出现如下错误:
Msg 121, Level 15, State 1, Line 1 The select list for the INSERT statement contains more items than the insert list. The number of SELECT values must match the number of INSERT columns.
我知道我可以使用临时表来做到这一点,但如果可能的话,我想将其保存在一条语句中。
最佳答案
将您的主查询包装在子查询中。
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;
关于tsql - 忽略 INSERT SELECT 语句中的中间列的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385580/