SQL INSERT INTO WITH SELECT query

не имея опыта работы с SQL, я надеялся, что кто-то может мне помочь.

у меня есть пустая временная таблица, а также таблица с информацией в ней.

мой контур моего запроса в его нынешнем виде выглядит следующим образом:

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

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

поэтому я передаю целую кучу идентификаторов в запрос, и где идентификатор соответствует идентификатору в Other_table, он должен заполнить временную таблицу этой информацией.

можно ли сохранить идентификаторы, которые не соответствуют где-то еще (скажем, другая временная таблица) в том же запросе? Или в ту же временную таблицу, только с Field1 = NULL в этом случае?

мне нужно сделать дополнительную работу над идентификаторами, которые не были сопоставлены, поэтому мне нужен готовый доступ к ним где-то. Я надеялся сделать все это в одном запросе, если это самый быстрый способ.

Edit:

Спасибо за помощь.

извинения, теперь я вижу, что мой вопрос не совсем ясен.

Если Other_table содержит идентификаторы 1-1000, и я передаю идентификаторы 999, 1000 и 1001, я хочу, чтобы временная таблица содержала информацию для 999 и 1000, а затем также запись с ID = 1001 с Field1 = NULL. Я не хочу, чтобы идентификаторы 1 - 998 возвращались с Field1 = NULL.

3 ответов


для каждого оператора insert можно использовать только одну целевую таблицу. поэтому, сохраняя field1 как null кажется, простой способ пойти:

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

оператор case вернется null id ID нет в списке.

обновление
После того, как вы обновили вопрос, это то, что я бы порекомендовал: Во-первых, вставьте список идентификаторов, которые вы используете в in оператор в другую временную таблицу:

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)

быстро исправить существующее решение, чтобы получить все значения из другой таблицы, которая не существует во временной таблице. Я отметил Field1 как 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] 

вы должны создать другой запрос для НЕ В код

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

что это значит мне нужно сделать дополнительную работу над идентификаторами, которые не были сопоставлены?не могли бы вы добавить более подробную информацию, возможно, мы можем сделать это в одном запросе, а не в отдельном

обновление

где этот (ТИПА ID1, ID2, КОТОРОЕ, Ш3...) откуда ? Можем ли мы использовать join ? Чем вы получите, что вы хотите, если ваш ответ да

попробуй этот

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