Oracle DUAL तालिका कैसे काम करती है?


32
SQL> desc dual
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY                                              VARCHAR2(1)

SQL> select 4*5 from dual;

       4*5
----------
        20

SQL>

मुझे यह वास्तव में अजीब लगता है। यदि दोहरे में 4 * 5 नाम का कोई कॉलम नहीं है, तो चयन कथन कैसे काम करता है?

इसके अलावा, जब मैं अपनी दोहरी तालिका बनाता हूं तो मुझे वही व्यवहार क्यों नहीं दिखाई देता?

SQL> create table dual2(dummy varchar2(1)); 

Table created.

SQL> desc dual2
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY                                              VARCHAR2(1)

SQL> select 4*5 from dual2;

no rows selected

SQL> 

जवाबों:


29

से विकिपीडिया :

DUAL तालिका एक विशेष एक-पंक्ति तालिका है जो सभी Oracle डेटाबेस स्थापनाओं में डिफ़ॉल्ट रूप से मौजूद है। यह SYSDATE या USER जैसे छद्म चॉकलेट के चयन में उपयोग के लिए उपयुक्त है। तालिका में एक एकल VARCHAR2 (1) स्तंभ है जिसे DUMMY कहा जाता है जिसका मान 'X' है।

इस प्रकार, दोहरी तालिका एक तरीका है, जिसके विरुद्ध परिचालनों को निष्पादित करने का एक तरीका है एक खाली लेकिन शून्य तालिका नहीं। यह तब उपयोगी होता है जब कोई तालिका की परवाह नहीं करता है, लेकिन एक चयनित विवरण के माध्यम से संचालन करने की आवश्यकता होती है। यदि तालिका में एक से अधिक पंक्ति या स्तंभ होते हैं, तो कई परिणाम वापस आ जाएंगे (ऑपरेशन के दौरान ट्यूपल्स के पूरे सेट पर काम करने के कारण)।

इसका उपयोग उत्पादन में नहीं किया जाना चाहिए, जब तक कि आपको विशेष रूप से SQL के माध्यम से कुछ प्रक्रियाओं को लागू करने की आवश्यकता न हो।

4*5एक गणितीय ऑपरेशन है, जैसे 'Foo' एक स्ट्रिंग है। इस प्रकार, जैसे कोई भी किसी भी तालिका से 4 * 5 का चयन कर सकता है, ठीक उसी तरह किसी भी तालिका से 'फू' का चयन कर सकता है, डीयूएल एक ज्ञात तालिका से इसे चुनने का एक तरीका है जिसमें कभी भी एकाधिक परिणाम नहीं होंगे।

से प्रलेखन (अवधारणाओं):

DUAL डेटा डिक्शनरी में एक छोटी सी तालिका है जिसे ओरेकल डेटाबेस और उपयोगकर्ता-लिखित कार्यक्रम एक ज्ञात परिणाम की गारंटी के लिए संदर्भित कर सकते हैं। दोहरी तालिका उपयोगी है जब एक मूल्य केवल एक बार वापस किया जाना चाहिए, उदाहरण के लिए, वर्तमान दिनांक और समय। सभी डेटाबेस उपयोगकर्ताओं के पास DUAL है।

DUAL तालिका में एक स्तंभ DUMMY और एक पंक्ति जिसमें मान X होता है।

और SQL संदर्भ :

DUAL डेटा डिक्शनरी के साथ Oracle डेटाबेस द्वारा स्वचालित रूप से बनाई गई एक तालिका है। DUAL उपयोगकर्ता SYS के स्कीमा में है लेकिन DUAL नाम से सभी उपयोगकर्ताओं के लिए उपलब्ध है। इसमें एक कॉलम, DUMMY है, जिसे VARCHAR2 (1) के रूप में परिभाषित किया गया है, और इसमें एक मान के साथ एक पंक्ति है। DUAL तालिका से चयन सेलेक्ट स्टेटमेंट के साथ एक स्थिर अभिव्यक्ति की गणना के लिए उपयोगी है। क्योंकि DUAL की केवल एक पंक्ति है, स्थिरांक केवल एक बार लौटाया जाता है। वैकल्पिक रूप से, आप किसी तालिका से एक स्थिर, छद्म चॉकलेट या अभिव्यक्ति का चयन कर सकते हैं, लेकिन मान को कई बार लौटाया जाएगा क्योंकि तालिका में पंक्तियाँ हैं। DUAL से एक निरंतर मान का चयन करने के कई उदाहरणों के लिए "SQL कार्य के बारे में" का संदर्भ लें।

Oracle डेटाबेस 10g रिलीज़ 1 के साथ शुरू, तार्किक I / O को DUAL तालिका पर प्रदर्शन नहीं किया जाता है जब एक अभिव्यक्ति की गणना होती है जिसमें DUMMY कॉलम शामिल नहीं होता है। यह अनुकूलन निष्पादन योजना में फास्ट डीयल के रूप में सूचीबद्ध है। यदि आप DUAL से DUMMY कॉलम का चयन करते हैं, तो यह अनुकूलन नहीं होता है और तार्किक I / O होता है।


5
"इसका उपयोग उत्पादन में नहीं किया जाना चाहिए, जब तक कि आपको विशेष रूप से SQL के माध्यम से कुछ प्रक्रियाओं को लागू करने की आवश्यकता न हो" क्यों नहीं?
निक पियरपॉइंट

2
मैं इस बात से भी सहमत नहीं हूं कि इसका इस्तेमाल उत्पादन में नहीं किया जाना चाहिए। ऐसा लगता है कि "भुना हुआ छोर काट देता है" मेम, मुझे।
एरिक

1
इस जवाब में सुधार की आवश्यकता है क्योंकि यह खुद से असहमत है। एक स्थान पर यह आधिकारिक डॉक्स से कॉपी करता है: "दोहरी तालिका उपयोगी है " और दूसरे में यह अनुशंसा करता है कि "इसका उत्पादन में उपयोग नहीं किया जाना चाहिए , जब तक ..."
ypercubeᵀᴹ

18

DUAL एक तालिका है जिसमें ठीक एक पंक्ति है जैसा कि निम्नलिखित एसक्यूएल स्टेटमेंट दिखाएगा:

SELECT * FROM dual;

आपकी dual2तालिका में कोई पंक्तियाँ नहीं हैं। यदि आप एक सम्मिलित करते हैं, तो आप एक ही व्यवहार देखेंगे।

4 * 5 एक अभिव्यक्ति है जो ओरेकल वास्तव में तालिका से डेटा का उपयोग किए बिना मूल्यांकन कर सकता है। यह हर पंक्ति के लिए एक बार इसका मूल्यांकन करेगा, ठीक वैसे ही जैसे यह एक सामान्य कॉलम अभिव्यक्ति के साथ करेगा। इसलिए यदि कोई पंक्ति नहीं है, तो कोई परिणाम नहीं मिलता है, अगर दो पंक्तियाँ हैं, तो आपको 20 बार दो बार मिलेंगे।


14

dualतालिका "काम करता है" लगभग अभी जिस तरह किसी अन्य तालिका काम करता है: यह एक मेज जिसमें से आप रिकॉर्ड का चयन कर सकते है।

इसका मतलब है, उदाहरण के लिए, आप तालिका का वर्णन कर सकते हैं। यहाँ, में SQL*Plus:

SQL> set lines 50
SQL> desc dual
Name                    Null?    Typ
----------------------- -------- ----------------
DUMMY                            VARCHAR2(1)

तो, तालिका में एक कॉलम है, जिसका नाम dummyए है varchar2(1)

तालिका में डिज़ाइन द्वारा, एक रिकॉर्ड (कम से कम अगर कोई इसके साथ भरा नहीं है):

SQL> select count(*) from dual;

COUNT(*)
----------
         1

तो, dual2आपके साथ जैसा व्यवहार है, उसे पाने के लिए dual, आपको एक रिकॉर्ड दोहरी में सम्मिलित करना होगा। बेहतर अभी तक, इसे create table as select(ctas) के साथ बनाएं :

SQL> create table dual2 as select * from dual;

अब, आपकी क्वेरी काम करती है:

SQL> select 4*5 from dual2;
       4*5
----------
        20

इससे पहले, मैंने कहा कि दोहरी लगभग किसी भी अन्य तालिका की तरह काम करती है। तो, जब यह किसी भी अन्य तालिका की तरह काम नहीं करता है?

यह अलग तरह से व्यवहार करता है, यदि तालिका से कोई मूल्य स्वयं चयनित नहीं है। फिर से, आपके प्रश्नों के साथ, मैंने ओरेकल को उन्हें समझाने दिया ...

SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;

EXPLAIN PLAN ausgef³hrt.

... यह देखने के लिए कि तालिका कैसे एक्सेस की जाती है:

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3445655939

-------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |     1 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL2 |     1 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------

यह देखा जा सकता है कि स्टेटमेंट full table accessऑन करता है dual2

अब, एक ही बात के साथ dual:

SQL> explain plan for select 4*5 from dual;

EXPLAIN PLAN ausgef³hrt.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------
Plan hash value: 1388734953

-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
|   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------

यह वह जगह है जहां dualतालिका अलग तरह से व्यवहार करती है: मान की dummyआवश्यकता नहीं है, इसलिए fast dualडिस्क पर वास्तविक मूल्य को नहीं पढ़ने के लिए उदाहरण के लिए, एक ऑपरेशन निष्पादित किया जाता है।


10

संयोग से, DUAL उन कुछ 'तालिकाओं' में से एक है जो तब काम करती है जब इंस्टेंस शुरू किया गया हो, लेकिन डेटाबेस को खोला नहीं गया हो।

आपको कुछ मिलता है

ADDR     INDX   INST_ID D
-------- ------ ------- -
0C0362D4      0       1 X

9

अन्य उत्तरों के अलावा, ओरेकल रिक्त स्थान SQL टेक्स्ट (कुछ स्थानों पर कम से कम) के बारे में इतना उपयुक्त नहीं है। एसक्यूएल पार्सर भी कुछ मामलों में वर्ण वर्ग के अंतर से टोकन लेता है, न कि केवल व्हाट्सएप द्वारा।

उदाहरण के लिए, आप ऐसे बयान चला सकते हैं:

एसक्यूएल> दोहरे से * चयन करें;

डी
-
एक्स


एसक्यूएल> दोहरे से चयन (1);

       (1)
----------
         1

एसक्यूएल> दोहरे से चयन-शून्य;

     -शून्य
----------


एसक्यूएल> दोहरे से चयन -1;

        -1
----------
        -1

एसक्यूएल> 

इसमें बिना किसी व्हाट्सएप के भी SQL चलाना संभव है:

SQL> का चयन करें * से / ** / दोहरी;

डी
-
एक्स

मेरे पास यहाँ कुछ और उदाहरण हैं:

http://blog.tanelpoder.com/2008/01/14/can-you-write-a-working-sql-statement-without-using-any-whitespace/

तानेल पोडर


2
कई स्थानों को छोड़ने की यह क्षमता ओरेकल के लिए अद्वितीय नहीं है। SQL सर्वर में समान कार्य करता है।
एलिक

8

एक तेज़ दोहरी कार्रवाई आपके कोड को फिर से क्वेरी करने के लिए x $ दोहरे लिखती है। क्योंकि यह "तालिका" SGA में एक सी डेटा संरचना है, आप इसे नामांकित मोड में क्वेरी कर सकते हैं।


4

सवाल का जवाब पहले से ही है। ये दोहरी तालिका के उद्देश्य के लिए कुछ नोट हैं। दोहरे का उपयोग चयन खंड में अभिव्यक्तियों के मूल्यांकन के लिए किया जा सकता है। कई अन्य डेटाबेस सिस्टम को इस उद्देश्य के लिए ऐसी तालिका की आवश्यकता नहीं होती है। MS SQL Server, MySql, Posgres निम्नलिखित कथन का मूल्यांकन कर सकते हैं

select 3+5 ;

ओरेकल नहीं कर सकता। ऑरेकल सेलेक्ट स्टेटमेंट को हमेशा "से" -क्लाज की जरूरत होती है।

कुछ कार्यों को DUMP जैसे pl / sql अभिव्यक्ति में उपयोग नहीं किया जा सकता है

इसलिए

declare
str varchar2(100);
begin
str:=dump('Hallo');
end;
/

एक अपवाद बढ़ाएगा लेकिन

declare
str varchar2(100);
begin
select dump('Hallo') into str from dual;
end;
/

काम करेगा।

इसका उपयोग क्वेरी के परिणाम सेट को विस्तारित करने के लिए किया जा सकता है

select user_id,username from user_users
union all
select -1,'NO USER'
from dual
/

जो दिया

| USER_ID |     USERNAME |
|---------|--------------|
|  476267 | USER_4_E8C50 |
|      -1 |      NO USER |

या चुनिंदा प्रश्नों के साथ डेटा जेनरेट करें CONNECT BY:

select level as n 
from dual
connect by level <= 5 ;

या एक पुनरावर्ती CTE:

with nlist(n) as (
  select 1 from dual
  union all
  select n+1
  from nlist 
  where n<5    )
select n
from nlist
 ;

जो लौटता है

| N |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |

में sqlfiddle


3

इसके लायक क्या है, यह MySQL में बिलकुल उसी तरह काम करता है।

mysql> use test;
Database changed

mysql> create table fred(billy int);
Query OK, 0 rows affected (0.79 sec)

mysql> select 4 + 5 from fred;
Empty set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
Empty set (0.00 sec)

mysql> insert into fred values(1);
Query OK, 1 row affected (0.13 sec)

mysql> select 4 + 5 from fred;
+-------+
| 4 + 5 |
+-------+
|     9 |
+-------+
1 row in set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
+------+
| mary |
+------+
|    9 |
+------+
1 row in set (0.00 sec)

mysql> insert into fred values(2);
Query OK, 1 row affected (0.08 sec)

mysql> select 4 + 5 from fred;
+-------+
| 4 + 5 |
+-------+
|     9 |
|     9 |
+-------+
2 rows in set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
+------+
| mary |
+------+
|    9 |
|    9 |
+------+
2 rows in set (0.00 sec)

mysql> explain select 4 + 5 as mary from fred;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | fred  | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

mysql> 

और यह भी प्रतीत होता है कि DUAL MySQL में भी मेमोरी संरचना में कुछ प्रकार है। दो व्याख्या योजनाओं में अंतर पर ध्यान दें - MySQL में DUAL के लिए "कोई तालिकाओं का उपयोग नहीं किया गया"।

दिलचस्प बात यह है कि, मैं MySQL के ड्यूल पर DESC नहीं कर सकता, जो कि Oracle से अलग है - लेकिन यह विशेष रूप से AIUI को पेश किया गया था जो Oracle SQLax को MySQL पर काम करने की अनुमति दे।

mysql> select 4 + 5 from dual;
+-------+
| 4 + 5 |
+-------+
|     9 |
+-------+
1 row in set (0.00 sec)

mysql> explain select 4 + 5 from dual;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

mysql> desc dual;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dual' at line 1
mysql> 

2

ऑरेकल डेटाबेस में, मूल रूप से छद्म-स्तंभों के मूल्य प्राप्त करने के लिए दोहरी तालिका का उपयोग किया जाता है। इसमें निम्नलिखित गुण हैं:

  1. यह sys उपयोगकर्ता के स्वामित्व में है
  2. यह सभी उपयोगकर्ताओं के लिए उपलब्ध है
  3. इसमें केवल एक कॉलम होता है, जिसका नाम डेटाटाइप Varchar2 (1) के साथ डमी है, इस कॉलम में एक वर्ण की अधिकतम चौड़ाई हो सकती है।

यदि आप अधिक विवरण प्राप्त करना चाहते हैं, तो यहां देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.