2013-03-10 2 views
5

मान लें द्वारा बनाई गई दो तालिकाओं देखते हैं:मैं दो तालिकाओं में शामिल होने पर एक ही क्वेरी में तालिका के ऊर्फ और उसके मूल नाम का उपयोग क्यों नहीं कर सकता?

CREATE TABLE emp 
(
EMPNO int, 
EMPNAME varchar(255), 
JOB varchar(255), 
DEPTNO int 
); 

CREATE TABLE dept 
(
LOC varchar(255), 
DEPTNO int 
); 

मैं क्या विभाग कोई काम है पता लगाना चाहते हैं। मैं एक बाईं का उपयोग इस तरह शामिल हो:

select dept.* 
from dept 
left join emp 
on (dept.deptno=emp.deptno) 
where emp.empno is null; 

लेकिन अगर मैं विभाग या रोजगार के लिए एक अन्य नाम का उपयोग, तो मैं केवल अन्य नाम का उपयोग कर सकते हैं और मूल तालिका नाम का उपयोग नहीं कर सकते हैं। उदाहरण के लिए:

select dept.* 
from dept as d 
left join emp 
on (dept.deptno=emp.deptno) 
where emp.empno is null; 

मुझे स्क्लाइट से "ऐसी कोई तालिका नहीं है: डिप्टी" त्रुटि मिली है।

यदि मैं एक टेबल पर संचालन चलाता हूं, तो मैं उसी क्वेरी में उपनाम और मूल तालिका नाम का उपयोग कर सकता हूं।

कोई भी जानता है क्यों?

+0

असाइन नहीं करते आप शायद गलत कर रहे हैं: यदि आप मूल नाम का उपयोग नहीं कर सकते हैं जब आप एक अलग उर्फ ​​[भले ही आप जानना चाहते हैं सौंपा है एक टेबल] (http://sqlfiddle.com/#!5/98a82/1)। किसी भी घटना में, जो व्यवहार आप देख रहे हैं वह SQL मानक के अनुसार है, जहां तक ​​मुझे पता है। –

उत्तर

7

एक बार जब आप किसी तालिका में उपनाम निर्दिष्ट करते हैं, तो यह क्वेरी के दौरान उसका नया नाम है - मूल नाम तब उपलब्ध नहीं है।

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

इसके अलावा, आप मूल नाम का उपयोग करना चाहते हैं, एक उपनाम

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