2014-03-28 53 views
-1

當select語句包含更多要插入表的列時,可以從select中插入嗎?INSERT SELECT TOP(n)ORDER BY列不包含在目標表中

考慮場景:

INSERT INTO table_1    --table_1 consist only of one column 

SELECT TOP 10 col1, col2  --col_2 is only selected because is used in ORDER BY 
FROM   table_2 
ORDER BY  col2 DESC 

上面的語句將導致錯誤。我會實現這個目標的一種方法是使用子查詢像

INSERT INTO table_1 

SELECT TOP 10 col1 
FROM (
     SELECT  col1, col2 
     FROM  table_2 
     ORDER BY col2 DESC 
    ) AS t 

但我不知道是否有例如使用等運營商像UPDATE語句直接的方式。

UPDATE

我提交簡化的示例道歉。那是因爲我認爲這是理所當然的,這將適用於我的場景,而不用實際測試它。

這是我的查詢的再現範圍內(上sqlfiddle進行試驗安裝了我的家用電腦上沒有SQL服務器)

CREATE TABLE table_1 (id INT) 
CREATE TABLE table_2 (id INT, col2 INT) 
CREATE TABLE table_3 (id INT, col2 INT) 
INSERT INTO table_2 VALUES (1,3),(2,2),(3,1) 
INSERT INTO table_3 VALUES (1,3),(1,2),(3,1) 

INSERT INTO table_1 

SELECT TOP 1 t.id, t.Qty 
FROM table_2 
INNER JOIN 
(
SELECT table_2.id, COUNT(table_3.id) AS Qty 
FROM table_2 
INNER JOIN table_3 on table_3.id = table_2.id 
GROUP BY table_2.id 
) AS t ON (t.id = table_2.id) 

ORDER BY t.Qty 

原始查詢要複雜得多,因此,我想避免另一個子 - 如果這是可能的話。

該查詢結果與錯誤說:

Column name or number of supplied values does not match table definition.: INSERT INTO table_1 SELECT TOP 1 table_1.id FROM table_1 INNER JOIN (SELECT table_2.id, COUNT(table_3.id) AS Qty FROM table_2 INNER JOIN table_3 on table_3.id = table_2.id GROUP BY table_2.id) AS t ON (t.id = table_1.id) ORDER BY t.Qty 
+3

您可以通過'col2'命令,而無需實際選擇它。 – GhostGambler

+0

@GhostGambler我怎麼能這樣做?我試過了,但是錯誤的結果是,列的順序必須包含在select語句中。 – Dimt

+1

您的查詢是否真的與示例一樣簡單,還是更復雜?如果涉及任何子查詢,那麼確實無法在子查詢中未選中的列上對父查詢進行排序。 – mellamokb

回答

2

截至不需要包括由山坳在選擇列表中的順序。

CREATE TABLE table_1 (id INT) 
GO 
CREATE TABLE table_2 (col1 INT, col2 INT) 
GO 
INSERT INTO table_2 VALUES (1,3),(2,2),(3,1) 
GO 
INSERT INTO table_1    --table_1 consist only of one column 
SELECT TOP 2 col1 
    FROM table_2 
ORDER BY col2 DESC 
+0

這正是我所說的,已經嘗試過,但調試器顯示col2必須包含在select中。 – Dimt

+0

該腳本適用於SSMS,適用於2012年的數據庫。很確定它會對付任何其他版本。我的樣品適合你嗎?如果是這樣,那麼我們需要詳細說明您的具體錯誤,並且正如問題評論中所建議的那樣,您可能已經過分簡化了該問題。 –

+0

是的,現在我知道我確實過分簡化了問題:)將提供正確的上下文。 – Dimt

0

您是否試過指定要插入的列?

INSERT INTO table_1 (id) 
SELECT TOP 1 table_1.id 
FROM   table_1 
INNER JOIN 
(
    SELECT  table_2.id, COUNT(table_3.id) AS Qty 
    FROM  table_2 
    INNER JOIN table_3 on table_3.id = table_2.id 
    GROUP BY table_2.id 
) AS t ON (t.id = table_1.id) 
ORDER BY t.Qty