Wstaw dane do tabeli temp za pomocą zapytania

144

Mam zapytanie, które generuje aktualne dane i chciałbym wstawić je do tabeli Temp, ale mam pewne problemy. Czy ktoś miałby jakiś wgląd w to, jak to zrobić?

Oto przykład

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%', '%') 

Wydaje się, że obecnie wyświetla moje dane w taki sposób, w jaki ich potrzebuję, ale chciałbym przekazać je do tabeli tymczasowej. Mój problem polega na tym, że jestem całkiem nowy w SQL Queries i nie byłem w stanie znaleźć sposobu, aby to zrobić. Lub jeśli to w ogóle możliwe. Jeśli nie jest to możliwe, czy istnieje lepszy sposób na przeniesienie danych, których szukam, WHERE application LIKE isNull('%MORESTUFF%','%')do tabeli tymczasowej?

kozioł ofiarny17
źródło
2
Do #temptabeli, która już istnieje, czy trzeba będzie utworzyć nową?
Martin Smith
1
@MartinSmith - To byłby nowy.
kozioł ofiarny 17
1
LIKE ISNULL('%MORESTUFF%', '%')zawsze będzie taki sam jak LIKE '%MORESTUFF%', prawda? Ponieważ „% MORESTUFF%” (literał łańcuchowy) nigdy nie jest pusty?
gnud

Odpowiedzi:

188
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%',
      '%')
Yosi Dahari
źródło
149

SQL Server R2 2008 wymaga następującej ASklauzuli:

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

Zapytanie nie powiodło się bez AS xkońca.


EDYTOWAĆ

Jest to również potrzebne podczas korzystania z SS2016, musiałem dodać as tdo końca.

 Select * into #result from (SELECT * FROM  #temp where [id] = @id) as t //<-- as t
Shaun Luttin
źródło
5
Ciekawy. Po prostu miałem ten sam problem. Dodanie „As [x]” na końcu sprawiło, że wszystko działało dobrze. Dlaczego to?
godfathr
5
@godfathr to dlatego, że klauzula from używa tabeli pochodnej
wootscootinboogie
35

Najszybszym sposobem na to jest użycie polecenia „WYBIERZ DO” np

SELECT * INTO #TempTableName
FROM....

Spowoduje to utworzenie nowej tabeli, nie musisz jej wcześniej tworzyć.

Yuriy Galanter
źródło
Czy można dodawać kolumny do #TempTableName?
FrenkyB
@FrenkyB tak, po utworzeniu tabeli możesz użyć instrukcji ALTER TABLE ADD COLUMN
Yuriy Galanter
12

Osobiście potrzebowałem małej ręki, aby dowiedzieć się, jak tego użyć i jest to naprawdę niesamowite.

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
theteague
źródło
8

Możesz to zrobić w ten sposób:

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

Po prostu upewnij się, że kolumny są zgodne, zarówno pod względem liczby, jak i typu danych.

wvdz
źródło
5

Spróbuj tego:

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

Użyj aliasu z x, aby skrypt i wynik nie zawiodły.

Alok Sharma
źródło
3
SELECT * INTO #TempTable 
FROM SampleTable
WHERE...

SELECT * FROM #TempTable
DROP TABLE #TempTable
Saqib A. Azhar
źródło
2

To jest możliwe. Spróbuj w ten sposób:

Create Global Temporary Table 
BossaDoSamba 
On Commit Preserve Rows 
As 
select ArtistName, sum(Songs) As NumberOfSongs 
 from Spotfy 
    where ArtistName = 'BossaDoSamba'
 group by ArtistName;
Luiz Henrique Lima
źródło