मुझे दोहरी तालिका से चयन क्यों करना है?


15

यह प्रमुख संबंध डेटाबेस प्रबंधन प्रणालियों में काम करता है जिसमें एसक्यूएल सर्वर, मायएसक्यूएल, पोस्टग्रेक्यूएल और SQLite ( वेबएसक्यूएल) होने के कारण स्टैकऑवरफ्लो / dba.stackexchange पर प्रदर्शित होने की सबसे अधिक संभावना है ।

select 'abc' abc, 1 def;

यह ओरेकल पर काम नहीं करता है। हमें Oracle में DUAL से चयन करने की आवश्यकता क्यों है? क्या SQL के लिए ISO / ANSI मानक को सेलेक्ट स्टेटमेंट के लिए FROM क्लॉज की आवश्यकता होती है ?


संपादित करें:

प्रति Bacon Bitउत्तर के अनुसार, यह SQL मानक द्वारा अपेक्षित प्रतीत होता है।

इसलिए वास्तव में, क्योंकि डीयूएलएल नाम एक ऐसा मिथ्या नाम है, अगर मैं एक टेबल बनाऊं और उसका नाम एटीओएम या वन, जैसे create table one (atom int);.. select 'abc' abc, 1 def FROM one;- क्या तुलनात्मक रूप से प्रदर्शन पर जुर्माना है SELECT .. FROM DUAL?


मुझे लगता है कि DB2 भी एक के selectबिना नहीं कर सकता from। DB2 में एक समान डमी तालिका है जिसे SYSIBM.SYSDUMMY1 कहा जाता है । इसके अलावा आप शायद यह पहले से ही जानते हैं, लेकिन जब आप select 'A' from dual, dualतालिका वास्तव में एक्सेस नहीं की जाती है , जो आपके संपादन में प्रश्न का उत्तर देता है (जो एक नए प्रश्न btw का विलय करता है)।
जैक का कहना है कि 5ans में topanswers.xyz

1
यह "सभी" DBMS में काम नहीं करता है । ऐसे कई DBMS हैं जो FROM के बिना एक सेलेक्ट की अनुमति नहीं देते हैं। मैनुअल प्रदर्शन के बारे में आपके प्रश्न का उत्तर देता है: docs.oracle.com/cd/E11882_01/server.112/e26088/…
a_horse_with_no_name

3
@JackDouglas: आप सही हैं। DB2 को एक FROMक्लॉज की आवश्यकता होती है । मेरे सिर के ऊपर से: इंफॉर्मिक्स, फायरबर्ड और अपाचे डर्बी को भी इसकी आवश्यकता है।
a_horse_with_no_name

1
DB2 को FROM क्लॉज़ की आवश्यकता होती है, लेकिन एक विकल्प जैसे कथन का उपयोग करना है values ('abc', 1)। आप निश्चित रूप से इस तरह के बयान से भी चयन कर सकते हैं:select abc from ( values ('abc',1) ) as t(abc,def)
लेनार्ट

जवाबों:


30

कड़ाई से, हाँ, FROMएक SELECTबयान का खंड वैकल्पिक नहीं है। SQL-99 के सिंटैक्स में मूल SELECTस्टेटमेंट का विवरण होता है , और FROMक्लॉज के चारों ओर कोई वर्ग ब्रैकेट नहीं होता है। यह इंगित करता है कि मानक इसे गैर-वैकल्पिक मानता है:

SELECT [ DISTINCT | ALL ]
{Column expression [ AS name ]} [ ,... ] | *
FROM <Table reference> [ {,<Table reference>} ... ]
[ WHERE search condition ]
[ GROUP BY Columns [ HAVING condition ] ]
[ORDER BY {col_name | expr | position} [ASC | DESC],...]                                     
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options |
 INTO DUMPFILE 'file_name' |
 INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]

वास्तविक उपयोग में, प्रोग्रामर और डीबीए अक्सर तालिकाओं में डेटा हेरफेर या टेबल और डेटा संरचनाओं में हेरफेर करने के अलावा अन्य चीजें करना उपयोगी पाते हैं। इस प्रकार की बात काफी हद तक SQL मानक के दायरे से परे है, जो विशिष्ट कार्यान्वयन के नट और बोल्ट से अधिक डेटा सुविधाओं से संबंधित है। हम चलाने के लिए चाहते हैं या नहीं SELECT getdate()या SELECT 1या SELECT DB_NAME()(या जो भी आपके बोली पसंद), हम नहीं वास्तव में एक मेज से डेटा चाहते हैं।

ओरेकल निम्नलिखित प्रभावी परिभाषा के साथ डमी टेबल का उपयोग करके मानक और कार्यान्वयन विसंगति को हल करने का विकल्प चुनता है:

CREATE TABLE DUAL (
  DUMMY CHAR(1)
  )

INSERT INTO DUAL (DUMMY) VALUES ('X')

अन्य RDBMSes अनिवार्य रूप से मान लेते हैं कि डमी टेबल का उपयोग किया जाता है यदि कोई FROMनिर्दिष्ट नहीं है।

दोहरी तालिका के इतिहास विकिपीडिया पर है:

DUAL तालिका Oracle Corporation के चार्ल्स वीस द्वारा आंतरिक विचारों में शामिल होने के लिए एक तालिका प्रदान करने के लिए बनाई गई थी:

मैंने Oracle डेटा शब्दकोश में एक अंतर्निहित वस्तु के रूप में DUAL तालिका बनाई। यह कभी भी खुद को देखने के लिए नहीं था, बल्कि एक ऐसे दृश्य के अंदर इस्तेमाल किया गया था, जिसके क्वेर होने की उम्मीद थी। विचार यह था कि आप DUAL तालिका में एक JOIN कर सकते हैं और अपनी तालिका में हर एक पंक्ति के परिणाम में दो पंक्तियाँ बना सकते हैं। फिर, ग्रुप बीवाई का उपयोग करके, परिणामी जोड़ को डीएटीए सीमा के लिए और इंडेक्स सीमा (एस) के लिए भंडारण की मात्रा दिखाने के लिए संक्षेप में प्रस्तुत किया जा सकता है। DUAL नाम, केवल एक से पंक्तियों की एक जोड़ी बनाने की प्रक्रिया के लिए उपयुक्त प्रतीत होता है।

मूल DUAL तालिका में दो पंक्तियाँ थीं (इसलिए इसका नाम), लेकिन बाद में इसमें केवल एक पंक्ति थी।


3
+1 और dba.se में आपका स्वागत है। यह इतिहास के एक आकर्षक बिट के साथ एक उत्कृष्ट जवाब है- मुझे आशा है कि आपको चारों ओर छड़ी करने और अधिक योगदान देने के लिए प्रोत्साहित किया जा सकता है :)
जैक कहते हैं कि topanswers.xyz

4
एक बार जब एक डेवलपर ने कुछ और पंक्तियों को दोहरे में डाला तो अंतहीन मज़ा के घंटे मेरे पास थे। बहुत सारी चीजें तोड़ दीं :) अपराधी को ट्रैक करने के लिए कुछ समय लिया!
फिलिप

8

dualआशावादी समझने dualका लाभ यह है कि एक विशेष एक पंक्ति, एक स्तंभ तालिका ( varchar2डेटा प्रकार के साथ ) है - जब आप इसे प्रश्नों में उपयोग करते हैं, तो यह योजना विकसित करते समय इस ज्ञान का उपयोग करता है।

हमें dualOracle में से चयन करने की आवश्यकता क्यों है ?

आप dualअपनी खुद की तालिकाओं से भी या से चुन सकते हैं, आप चाहें तो कर सकते हैं।

मेरे लिए, मैं dualक्योंकि मैं जानता हूँ कि मैं के साथ रहना होगा dual। मुझे पता है कि इसमें कम से कम 1 और अधिकतम 1 पंक्ति है। मुझे पता है कि ऑप्टिमाइज़र सभी के बारे में जानता है dualऔर मेरे लिए सबसे कुशल काम करता है। आशावादी समझता है dualकि एक जादू है, विशेष 1 पंक्ति तालिका। यह select *वहां पर रुक गया क्योंकि वहां एक पंक्ति होनी है। तो यह सिर्फ काम करने का तरीका है।


"मुझे पता है कि इसमें कम से कम 1 और अधिकतम 1 पंक्ति है।" खैर, डीबीए विशेषाधिकारों के साथ एक झटका (या एक बेवकूफ) संशोधित कर सकते हैंDUAL । सावधान रहे!
निक चामास

अगर आपके साथ भी ऐसा हो। इस व्यक्ति से क्रिएट सत्र को छोड़कर सभी विशेषाधिकारों को रद्द करें। और अगर किसी के द्वारा गलती से दोहरे को गिरा दिया गया तो क्या होगा?
देवयुद्ध २६'१३ को ६:२

आप इसे बनाने से पहले टेबल डुअल (डमी varchar2 (1)) स्टोरेज (शुरुआती 1) या फ्लैशबैक टेबल डुअल का उपयोग करके बना सकते हैं
DevYudh

खैर, किसी भी अन्य मौजूदा तालिका से अभिव्यक्ति का चयन करने की तुलना में डीयूएल का उपयोग करने में यह एक फायदा है, लेकिन यह नहीं बताता है कि
डॉगल को एफआरओआरक्यूएल

Oracle में @Lukasz Lech #MSSQL सर्व के लिए FROM के बिना कोई चयन नहीं है: SQL Server में दोहरी तालिका की कोई आवश्यकता नहीं है। लेकिन यदि आपने अपना कोड ऑरक्यूल से SQL सर्व में ट्रांसफर कर दिया है तो आप इस स्क्रिप्ट को बना सकते हैं दोहरी बना सकते हैं TATE DUAL (DUMMY VARCHAR (1)) GO INSERT INTO DUAL (DUMMY) VALUES ('X') GO पर जाएं, मुझे कोई दिखाई नहीं देता है SQL सर्वर में दोहरी तालिका का उपयोग / बनाने का कारण। और MSSQL सर्व और PostGRE SQL को डमी टेबल की आवश्यकता नहीं है
DevYudh

1

अन्य दो उत्तर मेरे उत्तर के लिए अच्छी पृष्ठभूमि प्रदान करते हैं।

ओरेकल डेटाबेस पर, यह पारंपरिक और विश्वसनीय है। यह अन्य डेटाबेस पर विफल हो जाएगा जिसमें एक DUALटेबल नहीं है । यह आवश्यक नहीं है कि आप उपयोग करें DUAL, लेकिन मैं आपको सलाह दूंगा।

मानकों का अनुपालन करने वाले डेटाबेस को FROMकम से कम तालिका संदर्भ निर्दिष्ट करने के लिए एक खंड की आवश्यकता होगी । यदि आपके पास ORDERS तालिका है, तो FROM DUALक्लॉज के लिए निम्न प्रतिस्थापन काम करेगा:

FROM   orders
WHERE  rownum =1

किसी भी तालिका या दृश्य का चयन करें जिसे आप चुन सकते हैं और यह काम करेगा। किसी तालिका या दृश्य का चयन करें जिसे आप नहीं चुन सकते हैं और यह विफल हो जाएगा। DUALएक DBA को तोड़ने पर रोक लगाने के रूप में अधिक विश्वसनीय है, सभी उपयोगकर्ता इसे से चुन सकते हैं, और परिणाम सेट में केवल एक पंक्ति प्राप्त करेंगे। (यह कभी-कभी टूट जाता है।)

मैं डेटा तक पहुँचने के लिए मानकों के अनुरूप क्रिया से अनभिज्ञ हूँ जो तालिका संदर्भ सहित तालिका में नहीं है। यह देखते हुए कि मैं इस तरह के डेटा का कितना कम उपयोग करता हूं, मुझे ऐसी कोई आवश्यकता नहीं है। मेरे द्वारा चलाए जाने वाले कई मामलों को अलग-अलग तरीकों से बेहतर तरीके से हैंडल किया जा सकता है।


2
SELECT CURRENT_TIMESTAMP FROM (VALUES(1)) V(C)मानक अनुपालन है जो मैं मानता हूं और किसी विशेष तालिका पर भरोसा नहीं करता है।
मार्टिन स्मिथ

@MartinSmith मैंने तालिका संदर्भ का उपयोग करने के लिए अपनी प्रतिक्रिया अपडेट की है। यह वही है जो मेरा मतलब है और निर्दिष्ट होना चाहिए।
बिलचोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.