2010-02-23 14 views
20

मैं एक का चयन करें बयान है कि चला जाता है कहो ..ओरेकल एसक्यूएल में निर्दिष्ट कॉलम का चयन क्यों कर रहा है, और सब कुछ गलत है?

select * from animals 

तालिका के सभी कॉलम के एक प्रश्न परिणाम देता है।

अब, यदि तालिका animals का 42 वां स्तंभ is_parent है, और मैं इसे gender के बाद, अपने परिणामों में वापस लौटना चाहता हूं, इसलिए मैं इसे और अधिक आसानी से देख सकता हूं। लेकिन मैं अन्य सभी कॉलम भी चाहता हूं।

select is_parent, * from animals 

यह ORA-00936: missing expression देता है।

एक ही बयान Sybase में कार्य करेंगे, और मुझे पता है कि आप animals मेज पर एक मेज उपनाम जोड़ना यह काम करने के लिए (select is_parent, a.* from animals ani) प्राप्त करने की आवश्यकता है, लेकिन क्यों ओरेकल एक मेज उर्फ ​​जरूरत चाहिए सक्षम होने के लिए चयन करने के लिए काम करने के लिए?

+0

इस प्रश्न पूछने के लिए धन्यवाद। मैं SQL सर्वर से ओरेकल में संक्रमण कर रहा हूं। मुझे एक ही त्रुटि दिखाई दे रही है। – user3454439

उत्तर

17

वास्तव में, मूल समस्या को हल करना आसान है। आपको बस * अर्हता प्राप्त करनी है।

select is_parent, animals.* from animals; 

बस ठीक काम करना चाहिए। टेबल नामों के लिए उपनाम भी काम करते हैं।

+0

मैं कभी भी उत्पादन कोड में "*" नहीं डालूंगा, लेकिन यह मेरे आसपास की काम है। मैं कुछ "शिकार" कर रहा था और चुनिंदा (कोला || ',' कोलोब) जैसे "कंपाउंडपीके", * MYTABLE से कुछ कोशिश कर रहा था। उपनाम कामकाज के लिए धन्यवाद। वोट दें। – granadaCoder

1

अन्य नाम के लिए उपयोग। * प्रारूप के रूप में

select parent.*, child.col 
from parent join child on parent.parent_id = child.parent_id 

यही है, एक में शामिल होने में एक मेज से सभी स्तंभों का चयन, प्लस (वैकल्पिक) एक या अधिक अन्य तालिकाओं से स्तंभ का अनुसरण करता है।

तथ्य यह है कि आप इसे दो बार एक ही कॉलम का चयन करने के लिए उपयोग कर सकते हैं, केवल एक दुष्प्रभाव है। एक ही कॉलम को दो बार चुनने का कोई वास्तविक बिंदु नहीं है और मुझे नहीं लगता कि आलस्य एक वास्तविक औचित्य है।

+1

मुझे पता है कि यदि आप कई तालिकाओं का उपयोग करते हैं जिन्हें आपको परिभाषित करने की आवश्यकता है कि किसके लिए सभी कॉलम लौटाएंगे, लेकिन मैं सोच रहा था कि ओरेकल क्यों काम नहीं कर सकता है जब मेरे पास एक टेबल की पसंद है। इसके अलावा, मुझे एक 'कॉलम कॉलम' * मिलता है, जब डीबगिंग कॉलम को कॉपी करने और उन्हें एक्सेल में पोर्ट करने की कोशिश करने की तुलना में समय बचाता है, मैन्युअल रूप से मेलमैचिंग डेटाकॉलम के जोखिम के साथ कॉलम को घुमाता है। वास्तविक दुनिया में – glasnt

2

उत्पादन कोड में ऐसा करने में कोई योग्यता नहीं है। हमें चयन * निर्माण का उपयोग करने के बजाय स्पष्ट रूप से कॉलम का नाम देना चाहिए।

विज्ञापन के लिए पूछताछ के लिए, स्वयं को एक आईडीई - एसक्यूएल डेवलपर, TOAD, पीएल/एसक्यूएल डेवलपर, आदि प्राप्त करें - जो हमें एसक्यूएल में एक्सटेंशन की आवश्यकता के बिना प्रश्नों और परिणाम सेटों में हेरफेर करने की अनुमति देता है।

+2

'चुनें *' वास्तव में खतरनाक है। कॉलम जोड़े जाने से पहले मुझे पकड़ा गया है और प्रक्रियाओं में '*' का उपयोग किया जाता है। हालांकि, adhoc प्रश्नों के लिए, मेरा बयान पूरी तरह से मान्य था। – glasnt

1

असली दुनिया में Select * केवल खतरनाक जब पुनः प्राप्ति के बाद के बजाय नाम से सूचकांक संख्या से कॉलम की चर्चा करते हुए है, बड़ा समस्या अक्षमता है जब नहीं सभी स्तंभों resultset में आवश्यक हैं (नेटवर्क यातायात, CPU और स्मृति लोड)। बेशक यदि आप अन्य तालिकाओं से कॉलम जोड़ रहे हैं (जैसा कि इस उदाहरण में मामला खतरनाक हो सकता है क्योंकि इन तालिकाओं के समय के साथ मेल खाने वाले नामों के साथ कॉलम हो सकते हैं, select *, x उस मामले में कॉलम x को जोड़ा जाने पर विफल हो जाएगा तालिका जो पहले नहीं थी।

2

select * पर अब तक बहुत अच्छे उत्तर क्यों नहीं दिए जाने चाहिए और वे सभी बिल्कुल सही हैं। हालांकि, ऐसा नहीं लगता कि उनमें से कोई भी मूल प्रश्न का उत्तर क्यों देता है विशेष रूप से वाक्य रचना विफल रहता है।

दुख की बात है, मुझे लगता है कारण है ... "क्योंकि यह नहीं है"।

मैं इसे एकल टा से कोई लेना देना है नहीं लगता है ब्ली बनाममल्टी-टेबल क्वेरी:

यह ठीक काम करता है:

select * 
from 
    person p inner join user u on u.person_id = p.person_id 

लेकिन यह विफल रहता है:

select p.person_id, * 
from 
    person p inner join user u on u.person_id = p.person_id 

हालांकि यह काम करता है:

select p.person_id, p.*, u.* 
from 
    person p inner join user u on u.person_id = p.person_id 

यह साथ कुछ ऐतिहासिक अनुकूलता बात हो सकती है 20 वर्षीय विरासत कोड।

"खरीद क्यों !!!" के लिए दूसरा बाल्टी, why can't you group by an alias के साथ?

+1

नकारात्मक थोड़ा कठोर है। मुझे लगता है कि केवल रेन और खुद को आज तक पूछे गए सवाल का जवाब दिया है। अन्य सभी उत्तरों का कहना है कि "चयन *" का उपयोग नहीं किया जाना चाहिए। –

2

अच्छा सवाल है, मैं अक्सर इस अपने आप को आश्चर्य है, लेकिन फिर उन चीजों में से एक के रूप में यह स्वीकार कर लिया है ...

इसी समस्या यह है:

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent 

ORA-00904: "GEOMETRIE"."SDO_GTYPE": invalid identifier 

जहां geometrie प्रकार का एक स्तंभ है mdsys.sdo_geometry।

उपनाम जोड़ें और यह काम करता है।

sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a; 
0

क्यों ओरेकल एक मेज उर्फ ​​जरूरत है चाहिए बाहर काम करने का चयन

Teradata एक ही आवश्यकता होती है सक्षम होने के लिए। चूंकि दोनों काफी पुराने हैं (शायद बेहतर इसे परिपक्व :-) डीबीएमएसएस यह ऐतिहासिक कारण हो सकता है।

मेरे सामान्य विवरण है: एक अयोग्य * मतलब है सब कुछ/सभी स्तंभों और पार्सर/अनुकूलक बस उलझन में है क्योंकि आप सब कुछ से अधिक अनुरोध करते हैं।

संबंधित मुद्दे