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

标签 tsql

对于 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/

相关文章:

sql-server-2008 - 插入表变量CTE

sql - 从SQL Server 2008中的任意sql语句获取数据类型

sql - 多次选择同一行

sql - 如何在 T-SQL 中删除默认值或类似约束?

SQL查询统计频率

sql-server - 获取给定年份中所有星期六的日期 - sql server

sql-server - 什么是 T-SQL 授予对 SQL Server 数据库中表的读写访问权限?

c# - 无法从用法中推断出方法的类型参数。尝试指定类型参数 ex - 错误。任何指导?

sql-server - 什么是 "Instead of"触发器?

sql-server - TSQL插入一组行和相关行