2012-02-09 12 views
39

Potrzebuję utworzyć tabelę tymczasową z tymi samymi kolumnami i typem co tabela stała. Jaki jest najlepszy sposób na zrobienie tego? (Stały stół ma ponad 100 kolumn)Najlepszy sposób utworzenia tabeli tymczasowej z tymi samymi kolumnami i typem co stały tabela

tj

Zazwyczaj tworzę tabelę tak.

DECLARE #TT TABLE(    
    member_id INT,  
    reason varchar(1),  
    record_status varchar(1) ,  
    record_type varchar(1)  
) 

Ale czy jest jakiś sposób, aby to zrobić bez wymieniania nazwy kolumn i rodzaj, ale wymienić nazwę innej tabeli z wymaganych kolumn?

+1

To nie jest tabela tymczasowa, to jest zmienna tabeli. –

+0

@ nathangonzalez- tak to jest .. aktualizowanie pytania .. Wierzę, że odpowiedzi dotyczą obu .. proszę oświecić jeśli nie – Ananth

+0

@Ananth, zmienne tabel muszą być jawnie zadeklarowane, więc sposób, w jaki był pierwotnie, jest tak dobry jak to się dzieje. tabele tymczasowe mogą być tworzone za pomocą instrukcji 'select into', która jest bardziej odporna na przyszłe i mniej czasochłonne niż ręczne ddl –

Odpowiedz

86
select top 0 * 
into #mytemptable 
from myrealtable 
+1

+1 Byłem z "gdzie 0 = 1", ale twoje rozwiązanie jest szybsze. –

+1

@JoachimIsaksson - Po prostu nie interesowało mnie, jak to zmierzyłeś? Zrobiłem kilka prostych testów na własną rękę i nie widzę różnicy między tymi dwoma. –

+0

@MikaelEriksson Nie zrobiłem głębszej analizy, ale zobaczyłem niewielką różnicę, uruchomienie starszego serwera SQL i top 0 wydaje się nie mieć dostępu do tabel ani indeksów, podczas gdy 0 = 1 wydaje się mieć dostęp do głównego indeksu klucza. Nie wiem jednak, jak duże są różnice w czasie, nie ma wielkiego stołu do przetestowania. Co więcej, zależy to od implementacji, więc w nowszych wersjach może być inaczej. –

7

Sortest jeden ...

select top 0 * into #temptable from mytable 

Uwaga: To tworzy pustą kopię temp, ale nie tworzy podstawowy klucz

+0

spowoduje to również wstawienie wszystkich danych. –

+0

@Nathangonzalez: próbowałem i rozwiązanie działało idealnie .. Tylko tabela została utworzona bez żadnych danych – Ananth

+0

@Antanth, odpowiedź została zredagowana po moim komentarzu. –

1
select * into #temptable from tablename where 1<>1 
+0

Jeśli się nie mylę, upadek jest taki, że serwer sql musi oszacować 1 <> 1 dla każdego wiersza w tabeli. –

+2

@nathangonzalez: Nie, nie ma. Optymalizator nie jest taki głupi. –

+0

@ypercube, to chyba jestem w błędzie. widzę, że robi ciągłe skanowanie. Przypuśćmy, że powinienem był sprawdzić. –

7

jest to Odpowiedź specyficzna dla MySQL, nie wiem, gdzie jeszcze działa -

Możesz utworzyć puste t mógł mieć takie same definicje kolumn z:

CREATE TEMPORARY TABLE temp_foo LIKE foo; 

I można utworzyć zaludnionych kopię istniejącej tabeli z:

CREATE TEMPORARY TABLE temp_foo SELECT * FROM foo; 

oraz następujące prace w PostgreSQL; niestety różne RDBMS nie wydają bardzo spójna tutaj:

CREATE TEMPORARY TABLE temp_foo AS SELECT * FROM foo; 
6

uświadamiam sobie to pytanie jest bardzo stary, ale dla każdego, kto szuka rozwiązania konkretnego do PostgreSQL, to:

CREATE TEMP TABLE tmp_table AS SELECT * FROM original_table LIMIT 0; 

pamiętać, że tabela tymczasowa zostanie umieszczona w schemacie podobnym do pg_temp_3.

Spowoduje to utworzenie tabeli tymczasowej, która będzie miała wszystkie kolumny (bez indeksów) i bez danych, jednak w zależności od potrzeb, może chcesz następnie usunąć klucz podstawowy:

ALTER TABLE pg_temp_3.tmp_table DROP COLUMN primary_key; 

Jeśli oryginalna tabela nie zawiera żadnych danych, możesz odejść od "LIMIT 0".

Powiązane problemy