2015-06-18 17 views
7

Brak doświadczenia z SQL, miałem nadzieję, że ktoś może mi w tym pomóc.SQL INSERT INTO WITH SELECT zapytanie

Mam pustą tabelę tymczasową, a także tabelę z zawartymi w niej informacjami.

Moja zarys mojego zapytania, gdyż stoi to w następujący sposób:

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

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

Jestem więc przekazując całą masę identyfikatorów do zapytania i gdzie ID odpowiada ID w Other_table, musi zapełnij tabelę tymczasową tymi informacjami.

Czy możliwe jest zapisanie identyfikatorów, które nie pasowały w innym miejscu (np. Inna tabela temp) w ramach tego samego zapytania? Lub do tej samej tabeli temp, tylko z Field1 = NULL w tym przypadku?

Muszę wykonać dodatkową pracę na identyfikatorach, które nie zostały dopasowane, więc potrzebuję gdzieś do nich gotowego dostępu. Miałem nadzieję, że zrobię to wszystko w tym jednym zapytaniu, jeśli to najszybszy sposób.

Edytuj:

Dzięki za pomoc.

Przepraszam, teraz widzę, że moje pytanie nie jest do końca jasne.

Jeśli Other_table zawiera identyfikatory 1 - 1000, a ja przekazuję identyfikatory 999, 1000 i 1001, chcę, aby tabela tymczasowa zawierała informacje dla 999 i 1000, a także wpis o ID = 1001 z polem 1 = NULL . Nie chcę, aby identyfikatory 1 - 998 były zwracane z Field1 = NULL.

+0

SELECT ID, Field1 z [Other_table] WHERE ID NOT IN (ID1, ID2, ID3 ...)? –

+0

Ok może czegoś mi brakuje, ale to będzie po prostu odwrotnie niż moje obecne zapytanie; Chcę, żeby to było jedno w tym samym zapytaniu? Lub najszybszy sposób na osiągnięcie obu wyników. – Alex

Odpowiedz

4

można wykorzystywać tylko jedną tabelę docelową dla każdego INSERT. Dlatego utrzymanie field1 jako NULL Wygląda na to łatwy sposób, aby przejść:

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

oświadczenie sprawa powróci null identyfikator ID nie ma na liście.

Aktualizacja
Po zaktualizowaniu pytanie, to co polecam: pierwsze, wstawić listę identyfikatorów używasz w operatorze in do innej tabeli tymczasowej:

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

następnie użyj zwykłego lewego łączenia:

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

Dzięki @Zohar Peled. To było bardzo pomocne, z wyjątkiem tego, że chcę wyniki na odwrót, moje pytanie nie było jasne. Zmieniłem to. – Alex

+0

Dzięki @Zohar Peled. – Alex

3

Musisz utworzyć drugą kwerendę dla NOT IN identyfikatora

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

i drugi

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

Co to znaczy muszę zrobić dodatkowej pracy na identyfikatory, które nie były dopasowany? Czy możesz dodać więcej szczegółów, może uda nam się to zrobić w jednym zapytaniu, a nie osobnym

Aktualizacja

Gdzie ten (ID1, ID2, ID3 ...) pochodzi? Czy możemy użyć join? Niż wil masz co chcesz, jeśli odpowiedź jest Tak

próbować ten jeden

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

czy to

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

Dzięki, więc uważasz, że muszę zrobić dwa pytania, to jest to, co myślałem, ale chciałem się upewnić. "Inna praca" oznacza wysłanie zapytania do innego serwera, aby uzyskać te informacje, o ile mogę powiedzieć, że nie dotyczy to mojego pytania tutaj. Chcę, aby tabela tymczasowa zawierała znalezione informacje, a lista identyfikatorów, które nie zostały znalezione, jest łatwo dostępna. – Alex

+0

@Alex Mam zaktualizowaną moją odpowiedź, możesz użyć _Union_ w tym przypadku i przechowywać wyniki w tym samym # temp-table –

+0

'case' jest częścią t-sql od co najmniej serwera sql 2000. O ile OP nie działa jakoś z starszą wersję, wtedy sugerowane rozwiązania są w najlepszym wypadku komplikacjami. –

3

Najszybszą poprawką do istniejącego rozwiązania jest uzyskanie wszystkich wartości z Tej tabeli, która nie istnieje w tabeli temp.. Zaznaczam Field1 jako NULL dla wszystkich Id.

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) 

Innym sposobem jest umieszczenie go w tym samym 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]