Вставить данные во временную таблицу с запросом


150

У меня есть существующий запрос, который выводит текущие данные, и я хотел бы вставить его в таблицу Temp, но у меня возникают некоторые проблемы с этим. Кто-нибудь знает, как это сделать?

Вот пример

SELECT *
FROM  (SELECT Received,
              Total,
              Answer,
              ( CASE
                  WHEN application LIKE '%STUFF%' THEN 'MORESTUFF'
                END ) AS application
       FROM   FirstTable
       WHERE  Recieved = 1
              AND application = 'MORESTUFF'
       GROUP  BY CASE
                   WHEN application LIKE '%STUFF%' THEN 'MORESTUFF'
                 END) data
WHERE  application LIKE isNull('%MORESTUFF%', '%') 

Кажется, что сейчас мои данные выводятся так, как мне нужно, но я хотел бы передать их в таблицу Temp. Моя проблема в том, что я новичок в SQL-запросах и не смог найти способ сделать это. Или, если это вообще возможно. Если это невозможно, есть ли лучший способ получить данные, которые я ищу, WHERE application LIKE isNull('%MORESTUFF%','%')во временную таблицу?


2
В #tempтаблицу, которая уже существует, или нужно будет создать новую?
Мартин Смит

1
@MartinSmith - Это будет новый.
scapegoat17

1
LIKE ISNULL('%MORESTUFF%', '%')всегда будет так же LIKE '%MORESTUFF%', не так ли? Поскольку "% MORESTUFF%" (строковый литерал) никогда не бывает нулевым?
gnud

Ответы:


195
SELECT *
INTO #Temp
FROM

  (SELECT
     Received,
     Total,
     Answer,
     (CASE WHEN application LIKE '%STUFF%' THEN 'MORESTUFF' END) AS application
   FROM
     FirstTable
   WHERE
     Recieved = 1 AND
     application = 'MORESTUFF'
   GROUP BY
     CASE WHEN application LIKE '%STUFF%' THEN 'MORESTUFF' END) data
WHERE
  application LIKE
    isNull(
      '%MORESTUFF%',
      '%')

154

SQL Server R2 2008 нуждается ASв следующем предложении:

SELECT * 
INTO #temp
FROM (
    SELECT col1, col2
    FROM table1
) AS x

Запрос не выполнен без AS xсимвола в конце.


РЕДАКТИРОВАТЬ

Это тоже нужно при использовании SS2016, пришлось добавить as tв конец.

 Select * into #result from (SELECT * FROM  #temp where [id] = @id) as t //<-- as t

5
Интересно. У меня была такая же проблема. Добавление «As [x]» в конце заставило все работать нормально. Почему это?
godfathr

5
@godfathr это потому, что предложение from использует производную таблицу
wootscootinboogie

37

Самый быстрый способ сделать это - использовать команду «SELECT INTO», например

SELECT * INTO #TempTableName
FROM....

Это создаст новую таблицу, вам не нужно создавать ее заранее.


Можно ли добавлять столбцы в #TempTableName?
FrenkyB

@FrenkyB да, как только таблица будет создана, вы можете использовать оператор ALTER TABLE ADD COLUMN
Юрий Галантер

13

Лично мне нужна была небольшая рука, чтобы понять, как это использовать, и это действительно здорово.

IF(OBJECT_ID('tempdb..#TEMP') IS NOT NULL) BEGIN DROP TABLE #TEMP END
        SELECT *
            INTO #TEMP
            FROM (
            The query you want to use many times
            ) AS X

SELECT * FROM #TEMP WHERE THIS = THAT
SELECT * FROM #TEMP WHERE THIS <> THAT
SELECT COL1,COL3 FROM #TEMP WHERE THIS > THAT

DROP TABLE #TEMP

8

Сделать это можно так:

INSERT INTO myTable (colum1, column2)
SELECT column1, column2 FROM OtherTable;

Просто убедитесь, что столбцы совпадают, как по количеству, так и по типу данных.


5

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

SELECT *
INTO #Temp
FROM 
(select * from tblorders where busidate ='2016-11-24' and locationID=12
) as X

Используйте псевдоним с x, чтобы скрипт и результат не потерпели неудачу.



2

Это возможно. Попробуйте так:

Create Global Temporary Table 
BossaDoSamba 
On Commit Preserve Rows 
As 
select ArtistName, sum(Songs) As NumberOfSongs 
 from Spotfy 
    where ArtistName = 'BossaDoSamba'
 group by ArtistName;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.