क्या UNION [ALL] के साथ SELECT INTO क्लॉज का उपयोग करना संभव है?


154

SQL सर्वर में यह ग्राहक रिकॉर्ड से tmpFerdeen में 100 रिकॉर्ड सम्मिलित करता है: -

SELECT top(100)*
INTO tmpFerdeen
FROM Customers

क्या यह संभव है कि एक चयन सभी में चयन का चयन करें: -

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 16

हाँ। जैसा कि रिकॉर्ड सभी तालिकाओं में अद्वितीय हैं।
फेर्डन

जवाबों:


214

यह SQL सर्वर में काम करता है:

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
यह भी काम करता है SELECT top 100 * INTO tmpFerdeen FROM Customer UNION सभी सेलेक्ट टॉप 100 * FROM CustomerEurope UNION सभी सेलेक्ट टॉप 100 * FROM CustomerAsia UNION सभी सेलेक्ट टॉप 100 * कस्टमरएमेरिसस का खेद है (खेद है कि यहाँ sql को फॉर्मेट नहीं किया जा सकता है)। धन्यवाद!
फेर्डन

7
"As tmp" का क्या महत्व है?
डेव

@chrisVanOpstal, आपने शीर्ष 100 का चयन क्यों किया है? जब हम सभी रिकॉर्ड का चयन करते हैं तो यह त्रुटि देता है- "दृश्य, इनलाइन फ़ंक्शंस, व्युत्पन्न टेबल, सबक्वेरी और सामान्य टेबल एक्सप्रेशंस में ORDER BY क्लॉज तब तक अमान्य है, जब तक कि TOP या XML के लिए भी निर्दिष्ट नहीं किया जाता है।" कृपया कुछ समाधान दें।
शैलेशदेव

1
@Dave ने जो पूछा, उसके बारे में हाय, मैं देखता हूं कि "as tmp" को हटाने से "त्रुटि, आईडी, या quoted_id" के रूप में गलत सिंटैक्स की त्रुटि होती है। तो इसका उपयोग किस लिए किया जाता है?
रविद्र गोल्डनबर्ग

4
@Dave, पेट्रिक: SQL सर्वर में, अस्थायी तालिकाओं को एक नाम दिया जाना चाहिए। बस इतना ही। Tmp SQL कथन को वैध बनाने के अलावा किसी अन्य फ़ंक्शन की सेवा नहीं करता है। उदाहरण के लिए, Oracle SQL पर, यह वैकल्पिक है।
राउटर

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

यह "ब्लाब्बल" आवश्यक है


1

एमएस एक्सेस प्रश्नों के लिए, इसने काम किया:

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
)

यह है कि यह एक विंडो डेटा सेट बनाता है जो रैम में रहता है और बड़े डेटा सेट पर यह समाधान गंभीर प्रदर्शन समस्या पैदा करेगा क्योंकि इसे पहले विभाजन बनाना होगा और फिर यह विभाजन का उपयोग टेम्पर टेबल पर लिखने के लिए करेगा।

एक बेहतर समाधान निम्नलिखित होगा:

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 ALL के लिए UNION बाहर स्वैप करें

शुभकामनाएँ!


-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)

आवश्यक तालिका उर्फ ​​(और अगर स्वीकार किए गए उत्तर के समान होगी) को याद कर रहे हैं
मार्टिन स्मिथ

-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 सर्वर में अस्थायी तालिकाएँ मक्खी पर बनाई गई हैं। मैं अंतिम ऑब्जेक्ट तालिका बनाए बिना ऐसा करना चाहूंगा। धन्यवाद।
फेर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.