Có thể sử dụng mệnh đề SELECT INTO với UNION [ALL] không?


154

Trong SQL Server, phần này chèn 100 bản ghi, từ bảng Khách hàng vào tmpFerdeen: -

SELECT top(100)*
INTO tmpFerdeen
FROM Customers

Có thể thực hiện CHỌN VÀO trên UNION ALL CHỌN: -

SELECT top(100)* 
FROM Customers
UNION All
SELECT top(100)* 
FROM CustomerEurope
UNION All
SELECT top(100)* 
FROM CustomerAsia
UNION All
SELECT top(100)* 
FROM CustomerAmericas

Không quá chắc chắn nơi để thêm mệnh đề INTO.


Bạn có chắc chắn bạn cần tất cả các công đoàn?
sfossen

Đúng. Vì hồ sơ là duy nhất trên tất cả các bảng.
Ferdeen

Câu trả lời:


214

Điều này hoạt động trong SQL Server:

SELECT * INTO tmpFerdeen FROM (
  SELECT top 100 * 
  FROM Customers
  UNION All
  SELECT top 100 * 
  FROM CustomerEurope
  UNION All
  SELECT top 100 * 
  FROM CustomerAsia
  UNION All
  SELECT top 100 * 
  FROM CustomerAmericas
) as tmp

1
Ngoài ra, công việc này CHỌN top 100 * VÀO tmpFerdeen TỪ khách hàng UNION Tất cả top 100 * TỪ khách hàng UNION Tất cả top 100 * TỪ khách hàng UNION Tất cả 100 * TỪ khách hàng hàng đầu (xin lỗi không thể định dạng sql ở đây). Cảm ơn!
Ferdeen

7
Tầm quan trọng của "như tmp" là gì?
Dave

@chrisVanOpstal, tại sao bạn lại chọn top 100? Khi chúng tôi chọn tất cả các bản ghi, nó sẽ báo lỗi - "Mệnh đề ORDER BY không hợp lệ trong các khung nhìn, các hàm nội tuyến, các bảng dẫn xuất, các truy vấn con và các biểu thức bảng chung, trừ khi TOP hoặc FOR XML cũng được chỉ định.". Xin vui lòng cho một số giải pháp.
ShaileshDev

1
Xin chào về những gì @Dave đã hỏi, tôi thấy rằng việc xóa kết quả "as tmp" sẽ xảy ra lỗi "Cú pháp không chính xác như mong đợi, id hoặc quoteed_id". Vậy nó dùng để làm gì?
Ravid Goldenberg

4
@Dave, petric: trong SQL Server, các bảng tạm thời cần được đặt tên. Đó là tất cả. Tmp không phục vụ bất kỳ chức năng nào khác ngoài việc làm cho câu lệnh SQL trở thành hợp lệ. Trên Oracle SQL, ví dụ, đây là tùy chọn.
Wouter

130

Bạn không cần một bảng dẫn xuất nào cho việc này.

Chỉ cần đặt INTOsauSELECT

SELECT top(100)* 
INTO tmpFerdeen
FROM Customers
UNION All
SELECT top(100)* 
FROM CustomerEurope
UNION All
SELECT top(100)* 
FROM CustomerAsia
UNION All
SELECT top(100)* 
FROM CustomerAmericas

2
Tôi không đồng ý - trong khi câu trả lời trên cũng đúng, câu trả lời được chấp nhận rõ ràng hơn trong ý định của nó
endurium 21/03/18

5
SELECT * INTO tmpFerdeen FROM 
(SELECT top(100)*  
FROM Customers 
UNION All 
SELECT top(100)*  
FROM CustomerEurope 
UNION All 
SELECT top(100)*  
FROM CustomerAsia 
UNION All 
SELECT top(100)*  
FROM CustomerAmericas) AS Blablabal

"Blablabal" này là cần thiết


1

Đối với các truy vấn MS Access, điều này đã hoạt động:

SELECT * INTO tmpFerdeen FROM( 
    SELECT top(100) *
    FROM Customers 
UNION All 
    SELECT top(100) *  
    FROM CustomerEurope 
UNION All 
    SELECT top(100) *  
    FROM CustomerAsia 
UNION All 
    SELECT top(100) *  
    FROM CustomerAmericas
) 

Điều này KHÔNG hoạt động trong MS Access

SELECT top(100) * 
  INTO tmpFerdeen
  FROM Customers
UNION All
  SELECT top(100) * 
  FROM CustomerEurope
UNION All
  SELECT top(100) * 
  FROM CustomerAsia
UNION All
  SELECT top(100) * 
  FROM CustomerAmericas

1

Tôi sẽ làm như thế này:

SELECT top(100)* into #tmpFerdeen
FROM Customers

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerEurope

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerAsia

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerAmericas

0

Thách thức tôi thấy với giải pháp:

FROM( 
SELECT top(100) *
    FROM Customers 
UNION
    SELECT top(100) *  
    FROM CustomerEurope 
UNION 
    SELECT top(100) *  
    FROM CustomerAsia 
UNION
    SELECT top(100) *  
    FROM CustomerAmericas
)

là điều này tạo ra một tập dữ liệu có cửa sổ sẽ nằm trong RAM và trên các tập dữ liệu lớn hơn, giải pháp này sẽ tạo ra các vấn đề hiệu năng nghiêm trọng vì trước tiên nó phải tạo phân vùng và sau đó nó sẽ sử dụng phân vùng để ghi vào bảng tạm thời.

Một giải pháp tốt hơn sẽ là như sau:

SELECT top(100)* into #tmpFerdeen
FROM Customers

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerEurope

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerAsia

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerAmericas

để chọn chèn vào bảng tạm thời và sau đó thêm các hàng bổ sung. Tuy nhiên, rút ​​lại ở đây là nếu có bất kỳ hàng trùng lặp trong dữ liệu.

Giải pháp tốt nhất sẽ là như sau:

Insert into #tmpFerdeen
SELECT top(100)* 
FROM Customers
UNION
SELECT top(100)* 
FROM CustomerEurope
UNION
SELECT top(100)* 
FROM CustomerAsia
UNION
SELECT top(100)* 
FROM CustomerAmericas

Phương pháp này sẽ hoạt động cho tất cả các mục đích yêu cầu các hàng riêng biệt. Tuy nhiên, nếu bạn muốn các hàng trùng lặp, chỉ cần trao đổi UNION cho UNION ALL

May mắn nhất!


-1

Có thể thử cái này?

SELECT * INTO tmpFerdeen (
SELECT top(100)* 
FROM Customers
UNION All
SELECT top(100)* 
FROM CustomerEurope
UNION All
SELECT top(100)* 
FROM CustomerAsia
UNION All
SELECT top(100)* 
FROM CustomerAmericas)

Thiếu bí danh bảng bắt buộc (và nếu được thêm sẽ giống như câu trả lời được chấp nhận)
Martin Smith

-3

Hãy thử một cái gì đó như thế này: Tạo bảng đối tượng cuối cùng, tmpFerdeen với cấu trúc của liên minh.

Sau đó

INSERT INTO tmpFerdeen (
SELECT top(100)* 
FROM Customers
UNION All
SELECT top(100)* 
FROM CustomerEurope
UNION All
SELECT top(100)* 
FROM CustomerAsia
UNION All
SELECT top(100)* 
FROM CustomerAmericas
)

Trong bảng tạm thời SQL Server được tạo nhanh chóng. Tôi muốn làm điều này mà không tạo ra một bảng đối tượng cuối cùng. Cảm ơn.
Ferdeen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.