2010-05-22 13 views
6

xxx10 xxx11 क्लॉज के बिना हमें एक टेबल पूछे बिना एकाधिक कॉलम प्राप्त करता है:क्या एकाधिक पंक्तियों के साथ टेबललेस चयन करना संभव है?

SELECT 17+23, REPLACE('bannanna', 'nn', 'n'), RAND(), CURRENT_TIMESTAMP; 

हम एक क्वेरी कैसे लिख सकते हैं जिसके परिणामस्वरूप तालिका में संदर्भ दिए बिना एकाधिक पंक्तियां होती हैं? असल में, SELECT का दुरुपयोग इसे डेटा परिभाषा विवरण में बदलने के लिए करें। परिणाम में एक कॉलम या एकाधिक कॉलम हो सकते हैं।

मुझे डीबीएमएस तटस्थ उत्तर में सबसे ज्यादा दिलचस्पी है, लेकिन अन्य (उदा। UNPIVOT पर आधारित) का स्वागत है। मैं इसे यथासंभव करने के कई तरीकों को इकट्ठा करना चाहता हूं। इस प्रश्न के पीछे कोई तकनीक अनुप्रयोग नहीं है; यह व्यावहारिक से अधिक सैद्धांतिक है।

उत्तर

12

एक UNION का प्रयोग करें

+---+ 
| 1 | 
+---+ 
| 1 | 
| 2 | 
+---+ 

उपयोग UNION ALL गैर-अद्वितीय पंक्तियों की हानि से बचने के।

+0

मैं बाहर वहाँ से पहले उत्तर किसी यूनिअन बम गिरा दिया कुछ और पाने के लिए आशा व्यक्त की थी। ठीक है। – outis

13

यदि आप अपने आरडीबीएमएस द्वारा समर्थित हैं तो आप Table Value Constructors का उपयोग कर सकते हैं। यहाँ Mr Celko

SELECT X.* 
FROM (VALUES (1, 3.07766, 6.31371, 12.7062, 63.65600), 
       (2, 1.88562, 2.91999, 4.30265, 9.92482), 
       (3, 1.63774, 2.35336, 3.18243, 5.84089)) AS X (A, B, C, D, E); 
1

से एक उदाहरण T-SQL का UNPIVOT स्तंभों को पंक्तियों से डेटा स्थानांतरित कर सकते हैं। एकाधिक unpivots प्रत्येक unpivoted कॉलम के कार्टेशियन उत्पाद के बराबर है।

SELECT N, S 
    FROM (SELECT 1 aa, 2 ab, 3 ac, 'a' ba, 'b' bb, 'c' bc) s 
    UNPIVOT (N for Num in (aa,ab,ac)) AS t 
    UNPIVOT (S for Str in (ba,bb,bc)) AS u 

परिणाम:

 
N | S 
--+-- 
1 | a 
1 | b 
1 | c 
2 | a 
2 | b 
2 | c 
3 | a 
3 | b 
3 | c