मैं सिर्फ कैसे Oracle में NULL
'अप्रत्याशित' व्यवहार को जन्म दे सकता समझाने के लिए एक उदाहरण बनाने की कोशिश कर रहा था, लेकिन मैं कुछ मैं उम्मीद नहीं थी पाया है ...ओरेकल - टेबल उर्फ और शून्य मूल्यांकन में शामिल होने में
स्थापना:
SQL> select * from tabNull T1 inner join tabNull T2 using(val);
VAL DESCR DESCR
---------- -------------------- --------------------
A ONE CHAR ONE CHAR
अगर मैं मेज उपनाम हटाने के लिए, मैं:
create table tabNull (val varchar2(10), descr varchar2(100));
insert into tabNull values (null, 'NULL VALUE');
insert into tabNull values ('A', 'ONE CHAR');
यह मेरी अपेक्षा देता
SQL> select * from tabNull inner join tabNull using(val);
VAL DESCR DESCR
---------- -------------------- --------------------
A ONE CHAR ONE CHAR
A ONE CHAR ONE CHAR
और यह मेरे लिए काफी आश्चर्यजनक है।
दो प्रश्नों के लिए निष्पादन योजनाओं में एक कारण पाया जा सकता है; तालिका उपनाम के साथ, ओरेकल एक HASH शामिल हों करता है और फिर T1.val = T2.val
लिए जाँच करता है:
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 118 | 7 (15)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 118 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| TABNULL | 2 | 118 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| TABNULL | 2 | 118 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T1"."VAL"="T2"."VAL")
उपनाम बिना
, यह पहली फिल्टर एक रिक्त नहीं मूल्यों के लिए मेज की घटना है, इस प्रकार केवल एक पंक्ति उठा, और फिर इसे एक कार्तीय बनाता है दूसरी घटना के साथ, इस प्रकार दो पंक्तियां दे रही हैं; भले ही यह सही है, मैं एक कार्टशियन के परिणाम की अपेक्षा करता हूं, लेकिन मेरे पास DESCR = 'NULL VALUE' के साथ कोई पंक्ति नहीं है।
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 118 | 6 (0)| 00:00:01 |
| 1 | MERGE JOIN CARTESIAN| | 2 | 118 | 6 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | TABNULL | 1 | 59 | 3 (0)| 00:00:01 |
| 3 | BUFFER SORT | | 2 | | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | TABNULL | 2 | | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("TABNULL"."VAL" IS NOT NULL)
क्या यह किसी भी तरह सही/अपेक्षित है? वापस पंक्तियों की संख्या की तुलना में कार्टेशियन का परिणाम भी अजनबी नहीं है? क्या मैं योजनाओं को गलत समझ रहा हूं, या इतना बड़ा लापता हूं कि मैं नहीं देख सकता?
मैं आमतौर पर "उपयोग" कीवर्ड का उपयोग नहीं करता, तो क्या होता है यदि आप इसके बजाय कीवर्ड पर उपयोग करते हैं? – Nick
चालू होने पर मुझे "कॉलम अस्पष्ट रूप से परिभाषित" से बचने के लिए कॉलम उपनाम का उपयोग करना होगा, इसलिए कोई प्रश्न नहीं; वही बात अगर मैं पुराने जॉइन सिंटैक्स – Aleksej
का उपयोग करता हूं तो दूसरा परिणाम सही नहीं है। –