2012-02-21 67 views
3

對於insert ... select語句,是否有一種方法可以忽略select語句所需但應該插入的變量?如何忽略INSERT 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 

結果是以下錯誤:

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.

我知道我可以使用臨時表做到這一點,但想如果可能的話,以保持它在單個語句。

回答

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; 
+0

希望避免在子查詢複製的一切,但如果沒有人有其他更好的建議來了,我會接受那。 –

+2

@ChipMcCormick - 您**需要**爲您的'WHERE'子句使用CTE或派生表才能工作。你不能在'WHERE'中引用列別名,也不能在'WHERE'中直接引用'RANK()'。 –