2012-02-09 5 views
39

Tôi cần tạo bảng tạm thời có cùng cột và nhập dưới dạng bảng vĩnh viễn. Cách tốt nhất để làm điều đó là gì? (Bảng thường trực có hơn 100 cột)Cách tốt nhất để tạo bảng tạm thời có cùng cột và nhập dưới dạng bảng vĩnh viễn

tức là

Thông thường tôi tạo bảng như thế này.

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

Nhưng có cách nào để làm điều đó mà không đề cập đến tên và loại cột, nhưng đề cập đến tên của một bảng khác với các cột bắt buộc?

+1

không phải bảng tạm thời, đó là biến bảng. –

+0

@ nathangonzalez- vâng nó là..cập nhật câu hỏi .. Tôi tin rằng các câu trả lời áp dụng cho cả hai .. xin vui lòng khai sáng nếu không – Ananth

+0

@Ananth, các biến bảng phải được khai báo một cách rõ ràng, do đó, cách nó ban đầu là về tốt như nó được. bảng tạm thời có thể được tạo bằng cách sử dụng câu lệnh 'select into', đây là bằng chứng trong tương lai và tốn ít thời gian hơn so với gõ ddl –

Trả lời

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

+1 Đã xảy ra với "nơi 0 = 1", nhưng giải pháp của bạn nhanh hơn. –

+1

@JoachimIsaksson - Chỉ cần quan tâm, làm cách nào bạn đo lường điều đó? Tôi đã làm một số thử nghiệm thô trên của riêng tôi và thấy không có sự khác biệt giữa hai. –

+0

@MikaelEriksson Không phân tích sâu hơn nhưng tôi thấy một sự khác biệt nhỏ, chạy một máy chủ SQL cũ và trên 0 dường như không truy cập vào bảng hoặc chỉ mục, trong khi 0 = 1 dường như truy cập vào chỉ mục khóa chính. Không chắc chắn làm thế nào lớn thời gian khác biệt khôn ngoan mặc dù, không có một bảng lớn để kiểm tra với. Ngoài ra, điều này nghe khá phụ thuộc vào việc triển khai thực hiện, vì vậy có thể khác nhau trong các phiên bản mới hơn. –

7

Sortest một ...

select top 0 * into #temptable from mytable 

Lưu ý: Điều này tạo ra một bản sao trống của temp, Nhưng nó không tạo ra một khóa chính

+0

điều này cũng sẽ chèn tất cả dữ liệu. –

+0

@nathangonzalez: tôi đã thử và giải pháp hoạt động hoàn hảo .. Chỉ cần bảng được tạo mà không có bất kỳ dữ liệu nào – Ananth

+0

@Ananth, câu trả lời đã được chỉnh sửa sau nhận xét của tôi. –

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

nếu tôi không nhầm, sự sụp đổ ở đây là máy chủ sql phải đánh giá 1 <> 1 cho mỗi hàng trong bảng. –

+2

@nathangonzalez: Không, nó không có. Trình tối ưu hóa không phải là câm. –

+0

@ypercube, sau đó tôi đoán tôi đã nhầm. tôi thấy nó quét liên tục. giả sử tôi nên đã kiểm tra. –

7

Đây là một Câu trả lời cụ thể cho MySQL, không chắc chắn nơi nào khác hoạt động -

Bạn có thể tạo một t rỗng có thể có các định nghĩa cột cùng với:

CREATE TEMPORARY TABLE temp_foo LIKE foo; 

Và bạn có thể tạo một bản sao dân cư của một bảng hiện có:

CREATE TEMPORARY TABLE temp_foo SELECT * FROM foo; 

Và các công việc sau trong postgres; tiếc là của RDBMS khác nhau dường như không phải là rất phù hợp ở đây:

CREATE TEMPORARY TABLE temp_foo AS SELECT * FROM foo; 
6

Tôi nhận ra câu hỏi này là rất cũ, nhưng đối với bất cứ ai tìm kiếm một giải pháp cụ thể để PostgreSQL, đó là:

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

Lưu ý, các bảng tạm thời sẽ được đưa vào một giản đồ như pg_temp_3.

này sẽ tạo ra một bảng tạm thời mà sẽ có tất cả các cột (không có chỉ số) và không có dữ liệu, tuy nhiên tùy thuộc vào nhu cầu của bạn, bạn có thể muốn sau đó xóa các khóa chính:

ALTER TABLE pg_temp_3.tmp_table DROP COLUMN primary_key; 

Nếu bảng gốc không có bất kỳ dữ liệu nào trong đó để bắt đầu, bạn có thể bỏ "LIMIT 0".