2015-06-18 12 views
7

Nicht mit SQL Erfahrung, ich hatte gehofft, jemand könnte mir dabei helfen.SQL INSERT INTO mit SELECT Abfrage

Ich habe eine leere temporäre Tabelle, sowie eine Tabelle mit Informationen darin.

Mein Umriss meiner Abfrage, wie es ist steht wie folgt:

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

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

So eine ganze Reihe von IDs auf die Abfrage ich vorbei, und in dem die ID in Other_table eine ID entspricht, muss es Füllen Sie die temporäre Tabelle mit diesen Informationen auf.

Ist es möglich, die IDs zu speichern, die nicht irgendwo anders (sagen wir eine andere temporäre Tabelle) innerhalb der gleichen Abfrage übereinstimmen? Oder zu der gleichen Temp-Tabelle, nur mit Field1 = NULL in diesem Fall?

Ich muss zusätzliche Arbeit an den IDs, die nicht übereinstimmten, so dass ich irgendwo Zugriff darauf brauche. Ich hatte gehofft, das alles in dieser einen Frage zu tun, wenn das der schnellste Weg ist.

Bearbeiten:

Vielen Dank für die Hilfe.

Entschuldigung, ich sehe jetzt, dass meine Frage nicht ganz klar ist.

Wenn Other_table IDs 1 - 1000 enthält und ich die IDs 999, 1000 und 1001 übergebe, möchte ich, dass die temporäre Tabelle die Informationen für 999 und 1000 enthält und dann auch einen Eintrag mit ID = 1001 mit Feld1 = NULL . Ich möchte nicht, dass die IDs 1 - 998 mit Field1 = NULL zurückgegeben werden.

+0

SELECT ID, Feld1 FROM [Other_table] WHERE ID enthält IN (ID1, ID2, ID3, ...)? –

+0

Ok vielleicht fehlt mir etwas, aber das wird nur das Gegenteil meiner aktuellen Abfrage tun; Ich möchte, dass es beides in derselben Abfrage tut? Oder der schnellste Weg, beide Ergebnisse zu erzielen. – Alex

Antwort

4

Sie nur eine Zieltabelle für jeden Insert-Anweisung verwenden können. Daher scheint, wie die einfache Möglichkeit, field1 als null zu halten gehen:

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

der Fall Anweisung null id die ID zurückkehren wird, ist nicht in der Liste.

aktualisieren
Nachdem Sie die Frage aktualisiert haben, ist es das, was ich empfehlen würde: Zuerst die Liste der IDs fügen Sie in der in Operator in eine andere temporäre Tabelle verwenden:

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

Verwenden Sie dann einfach eine einfache Linksverbindung:

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

Danke @Zohar Peled. Das war sehr hilfreich, außer ich möchte die Ergebnisse anders herum, meine Frage war nicht klar. Ich habe es geändert. – Alex

+0

Danke @Zohar Peled. – Alex

3

Sie müssen andere Abfrage für erstellen NICHT IN Ids

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

und andere

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

Was es bedeutet Ich brauche auf die IDs zusätzliche Arbeit zu tun, die nicht waren abgestimmt? Könnten Sie mehr Details hinzufügen, vielleicht können wir es in einer Abfrage nicht eine separate

aktualisieren

Wo dies (ID1, ID2, ID3 ...) kommen aus? Können wir mitmachen? Als Sie wil bekommen, was wollen Sie, wenn Ihre Antwort Ja

ist

dieses One

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...) 
) 

oder die Sie interessieren

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

Danke, also denke ich, dass ich zwei Anfragen machen muss, das dachte ich, wollte aber sicher gehen. Die "andere Arbeit" bedeutet, einen anderen Server abzufragen, um diese Information zu erhalten, soweit ich das beurteilen kann, nicht relevant für meine Frage hier. Ich möchte, dass die temporäre Tabelle die gefundenen Informationen enthält und die Liste der IDs, die nicht gefunden werden, leicht verfügbar ist. – Alex

+0

@Alex Ich habe meine Antwort aktualisiert, Sie können _Union_ in diesem Fall verwenden und speichern in der gleichen # temp-Tabelle speichern –

+0

'case' ist ein Teil von t-sql seit mindestens SQL Server 2000. Es sei denn, das OP arbeitet irgendwie mit eine ältere Version, dann sind Ihre vorgeschlagenen Lösungen bestenfalls Komplikationen. –

3

Die schnellste Lösung für Ihre bestehende Lösung ist es, alle Werte von o die Tabelle, die in Ihrer temporären Tabelle nicht existiert. Ich habe Field1 als NULL für alle diese IDs markiert.

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) 

Andere Weise ist es in der gleichen INSERT-Anweisung NOT

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] 
Verwandte Themen