2015-06-18 178 views
7

對於SQL沒有經驗,我希望有人能幫助我解決這個問題。SQL插入WITH SELECT查詢

我有一個空的臨時表,以及一個表中的信息。

我的我的查詢的外形,因爲它代表如下:

CREATE TABLE [#Temp] (ID Int, Field1 Varchar) 

INSERT INTO [#Temp] 
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...) 

所以我經過一大堆的ID來查詢,其中ID對應一個ID在Other_table,就必須用這些信息填充臨時表。

是否可以在同一個查詢中保存與其他地方不匹配的ID(比如另一個臨時表)?或者在同一個臨時表中,只是在這種情況下使用Field1 = NULL?

我需要對未匹配的ID做額外的工作,所以我需要隨時隨地訪問它們。如果這是最快的方法,我希望能夠在這一個查詢中完成這一切。

編輯:

感謝所有幫助。

道歉,我現在看到我的問題並不完全清楚。

如果Other_table包含ID 1 - 1000,並且傳入ID 999,1000和1001,我希望臨時表包含999和1000的信息,然後還包含ID = 1001且條目1 = NULL的條目。我不希望ID 1 - 998與Field1 = NULL返回。

+0

SELECT ID,字段1 FROM [Other_table] WHERE ID NOT IN(ID1,ID2,ID3 ......)? –

+0

好吧,也許我錯過了一些東西,但這隻會做我目前的查詢相反;我希望它能夠在同一個查詢中執行這兩個操作?或者是實現兩個結果的最快方法。 – Alex

回答

4

您只能使用一個目標表中的每個插入語句。因此,保持field1爲空似乎是最簡單的方式去:

INSERT INTO [#Temp] 
SELECT ID, CASE WHEN ID IN (ID1, ID2, ID3...) THEN Field1 END 
FROM [Other_table] 

case語句將返回null ID的ID不在列表中。

更新
你已經更新了問題之後,這是我會建議: 首先,將你正在使用的in運營商到另一個臨時表的ID列表:

create table #tempIDs (id int) 
insert into #tempIDs values(id1), (id2), (id3), .... 

那麼只需使用一個簡單的左連接:

INSERT INTO [#Temp] 
SELECT t1.ID, Field1 
FROM #tempIDs t1 
LEFT JOIN [Other_table] t2 ON(t1.id = t2.id) 
+0

謝謝@Zohar Peled。這是非常有幫助的,除非我想要結果相反,我的問題並不清楚。我修改了它。 – Alex

+0

謝謝@Zohar Peled。 – Alex

3

你必須爲創建其他查詢NOT IN標識的

SELECT ID, Field1 
into #temp1 
FROM [Other_table] WHERE ID NOT IN (ID1, ID2, ID3...) 

等一個

SELECT ID, Field1 
into #temp2 
FROM [Other_table] WHERE ID IN (ID1, ID2, ID3...) 

是什麼意思我需要做的是不是該ID的額外工作匹配?您能否添加更多細節,也許我們可以在一個查詢中做到這一點,而不是單獨的

更新

這個(ID1,ID2,ID3 ...)從哪裏來?我們可以使用連接嗎?比你西港島線得到你想要什麼,如果你的答案是

試試這個

SELECT * Into #temp 
FROM(
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...) 
    Union 
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID NOT IN (ID1, ID2, ID3...) 
) 

或本

SELECT ID, Field1 into #temp 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...) 
    Union 
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID NOT IN (ID1, ID2, ID3...) 
+0

謝謝,所以你認爲我必須做兩個查詢,這是我的想法,但想確保。 「其他工作」意味着查詢另一臺服務器以獲取這些信息,就我所知,這一點與我的問題無關。我想讓臨時表具有找到的信息,以及找不到可用的ID列表。 – Alex

+0

@Alex我更新了我的答案,你可以在這種情況下使用_Union_和結果存儲在同一個#temp-table –

+0

'case'是t-sql的一部分,因爲至少在sql server 2000中。除非OP在某種程度上與一個較舊的版本,那麼你的建議解決方案最好是過於複雜。 –

3

對現有解決方案的最快修復方法是從o中獲取所有值其他表不在您的臨時表中。我已將Field1標記爲所有這些Id的NULL。

CREATE TABLE [#Temp] (ID Int, Field1 Varchar) 

INSERT INTO [#Temp] 
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...) 

INSERT INTO [#Temp] 
SELECT ID, NULL AS Field1 
FROM [Other_Table] 
WHERE ID NOT IN (SELECT DISTINCT ID FROM #Temp) 

另一種方式是將其包括在同一個INSERT語句

CREATE TABLE [#Temp] (ID Int, Field1 Varchar(100)) 

INSERT INTO [#Temp] 
    SELECT ID, 
     CASE WHEN ID IN (ID1,ID2....) THEN Field1 
      ELSE NULL END AS 'Field1' 
    FROM [Other_Table]