เป็นไปได้ไหมที่จะใช้คำสั่ง SELECT INTO กับ UNION [ALL]?


154

ใน SQL Server สิ่งนี้จะแทรก 100 เรคคอร์ดจากตารางลูกค้าลงใน tmpFerdeen: -

SELECT top(100)*
INTO tmpFerdeen
FROM Customers

เป็นไปได้หรือไม่ที่จะทำ SELECT INTO ข้าม UNION ALL SELECT: -

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

ไม่แน่ใจว่าจะเพิ่มส่วนคำสั่ง INTO ได้ที่ไหนด้วย


คุณแน่ใจหรือว่าต้องการสหภาพทั้งหมด?
sfossen

ใช่. ในฐานะที่เป็นระเบียนที่ไม่ซ้ำกันในทุกตาราง
Ferdeen

คำตอบ:


214

สิ่งนี้ทำงานใน 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
นอกจากนี้ยังใช้งานได้เลือก 100 อันดับแรก * เข้าสู่ tmpFerdeen จากลูกค้ายูเนี่ยนเลือกทั้งหมด 100 อันดับแรกจาก CustomerEurope ยูเนี่ยนเลือกทั้งหมด 100 อันดับแรกจาก CustomerAsia ยูเนี่ยนเลือกทั้งหมด 100 อันดับแรกจากลูกค้า ขอบคุณ!
Ferdeen

7
ความหมายของ "as tmp" คืออะไร?
เดฟ

@chrisVanOpstal ทำไมคุณถึงเลือก 100 อันดับแรก เมื่อเราเลือกระเบียนทั้งหมดจะให้ข้อผิดพลาดเป็น - "ส่วนคำสั่ง ORDER BY นั้นไม่ถูกต้องในมุมมอง, ฟังก์ชั่นอินไลน์, ตารางที่ได้รับ, แบบสอบถามย่อยและการแสดงออกของตารางทั่วไปยกเว้นว่ามีการระบุ TOP หรือ FOR XML ด้วย" โปรดให้คำตอบ
ShaileshDev

1
สวัสดีเกี่ยวกับสิ่งที่ @Dave ถามฉันเห็นว่าการลบ "as tmp" ส่งผลให้เกิดข้อผิดพลาด "ไวยากรณ์ไม่ถูกต้องที่คาดว่าจะเป็น id หรือ quot_id" แล้วมันใช้ทำอะไร?
Ravid Goldenberg

4
@Dave, petric: ใน SQL Server จำเป็นต้องตั้งชื่อตารางชั่วคราว นั่นคือทั้งหมดที่ tmp ไม่ได้ให้บริการฟังก์ชั่นอื่นใดนอกจากทำให้คำสั่ง SQL เป็นหนึ่งที่ถูกต้อง บน Oracle SQL ตัวอย่างนี้เป็นทางเลือก
Wouter

130

คุณไม่จำเป็นต้องใช้ตารางที่ได้รับเลย

เพียงแค่ใส่INTOหลังจากแรกSELECT

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
ฉันไม่เห็นด้วย -
แม้ว่า

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" นี้เป็นสิ่งจำเป็น


1

สำหรับการสืบค้น MS Access สิ่งนี้ใช้ได้:

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
) 

สิ่งนี้ไม่ทำงานใน 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

ฉันจะทำเช่นนี้:

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

ความท้าทายที่ฉันเห็นด้วยวิธีแก้ปัญหา:

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

คือสิ่งนี้จะสร้างชุดข้อมูลแบบมีหน้าต่างที่จะอยู่ใน RAM และชุดข้อมูลขนาดใหญ่ขึ้นโซลูชันนี้จะสร้างปัญหาประสิทธิภาพการทำงานที่รุนแรงเนื่องจากต้องสร้างพาร์ติชันก่อนจากนั้นจะใช้พาร์ติชันเพื่อเขียนลงในตารางชั่วคราว

ทางออกที่ดีกว่าคือ:

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

เพื่อเลือกแทรกลงในตารางชั่วคราวแล้วเพิ่มแถวเพิ่มเติม อย่างไรก็ตามการดึงกลับมาที่นี่คือถ้ามีแถวที่ซ้ำกันในข้อมูล

ทางออกที่ดีที่สุดจะเป็นดังต่อไปนี้:

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

วิธีนี้ควรใช้ได้กับทุกวัตถุประสงค์ที่ต้องใช้แถวที่ต่างกัน อย่างไรก็ตามหากคุณต้องการแถวที่ซ้ำกันเพียงแค่สลับ UNION สำหรับ UNION ALL

ขอให้โชคดี!


-1

ลองนี่สิ

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)

ไม่มีนามแฝงของตารางที่ต้องการ (และหากเพิ่มจะเหมือนกับคำตอบที่ยอมรับ)
Martin Smith

-3

ลองดังนี้: สร้างตารางวัตถุสุดท้าย tmpFerdeen ด้วยโครงสร้างของสหภาพ

แล้วก็

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
)

ในตารางชั่วคราวของ SQL Server ถูกสร้างขึ้นอย่างรวดเร็ว ฉันต้องการทำสิ่งนี้โดยไม่สร้างตารางวัตถุสุดท้าย ขอบคุณ
Ferdeen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.