2009-08-11 11 views
6

बाध्य नहीं किया जा सका जब SQL क्वेरी में LEFT JOINing टेबल, कभी-कभी मुझे ON खंड में एकाधिक तालिकाओं का संदर्भ देने की आवश्यकता होती है। उदाहरण के लिए:एसक्यूएल त्रुटि: बहु-भाग पहचानकर्ता "tableName.ColumnName" को

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p, JobTable j 
LEFT JOIN SalaryTable s ON s.PeopleID=p.PeopleID AND s.JobID=j.JobID 

हालांकि, इसके बाद के संस्करण इस त्रुटि देना होगा:

SQL Error: The multi-part identifier "p.PeopleID" could not be bound.

ऐसा लगता है कि एक LEFT JOIN बयान में ON खंड केवल "देख" FROM में सूचीबद्ध पिछले तालिका कर सकते हैं सूची। क्या ये सच है? कोई कामकाज?

+0

देखें: http://stackoverflow.com/questions/1080097/the-multi-part-identifier-could-not-be-bound-on- sql-server-2005-8/1080407 # 1080407 –

उत्तर

7

आप नहीं कर सकते हैं SQL-89 को मिलाएं SQL-92 के साथ वाक्यविन्यास "तालिका, तालिका" में शामिल हों वाक्यविन्यास में शामिल हों "तालिका बाएं जॉइन टेबल ऑन शर्त"

+1

यह आप उन्हें मिश्रण कर सकते हैं लगता है, लेकिन आदेश महत्वपूर्ण कोशिश है: * चुनें \t से msdb..sysjobsteps रों, j.category_id = c.category_id जहां j पर जे में शामिल होने msdb..syscategories ग msdb..sysjobs। job_id = s.job_id –

+1

लेकिन जेरूस्नीड चाहता है जिस तरह से उन्हें मिश्रण करना स्पष्ट रूप से अलग है! –

+0

मुझे लगता है कि बाहरी तर्क तर्क को हल करने का प्रयास करते समय कंपाइलर को अपरिवर्तनीय समस्याएं पेश करता है। (बाहरी जुड़ने की स्थितियों की विशिष्टता उन चीजों में से एक है जो दोनों के बीच काफी अलग है)। – RBarryYoung

0

SELECT p.Name, j.Job, s.Salary 
FROM SalaryTable s 
LEFT JOIN PeopleTable p on s.PeopleID = p.PeopleID 
LEFT JOIN JobTable j ON s.JobID = j.JobID 
0

प्रयास करें मैं shure नहीं कर रहा हूँ क्यों कि si लेकिन PeopleTable पी से, JobTable j शामिल हों

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
    CROSS JOIN JobTable j 
    LEFT JOIN SalaryTable s ON s.PeopleID=p.PeopleID AND s.JobID=j.JobID 

बेस्ट Regrads, आयोर्डन क्रॉस साथ बदला जा सकता

+0

ऐसा होगा क्योंकि वह पहले से ही पुरानी अप्रचलित वाक्यविन्यास में शामिल होने वाले क्रॉस के रूप में लिखा गया था। मुझे विश्वास नहीं है कि उसने जो लिखा वह वही है जो उसे वास्तव में चाहिए। – HLGEM

3

जबकि क्रॉस सिंटैक्स में शामिल हो गया है, जो आपने प्रदान किया है उसका प्रत्यक्ष अनुवाद है, यह आपकी स्थिति के लिए सही नहीं हो सकता है। वेतन तालिका में में शामिल होने से पहले यह सभी लोगों को सभी नौकरियों से जोड़ देगा। ऐसा लगता है कि यह वही है जो आप चाहते हैं।

क्या आपके पास वास्तव में कोई भी व्यक्ति है जो वेतन से जुड़े नहीं हैं? उस मामले के लिए क्या आप कोई ऐसी नौकरियां देखना चाहते हैं जो वेतन या लोगों से जुड़ी न हो? नमूना डेटा और परिणाम सेट हमें आपको एक प्रश्न देने में मदद करेगा जो आपको वास्तव में चाहिए। मैं निम्न में से एक संदेह है कि आप बेहतर परिणाम दे सकता है:

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
JOIN SalaryTable s ON s.PeopleID=p.PeopleID 
RIGHT JOIN JobTable j ON s.JobID=j.JobID 

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
JOIN SalaryTable s ON s.PeopleID=p.PeopleID 
JOIN JobTable j ON s.JobID=j.JobID 

SELECT p.Name, j.Job, s.Salary 
FROM SalaryTable s 
RIGHT JOIN PeopleTable p ON s.PeopleID=p.PeopleID 
RIGHT JOIN JobTable j ON s.JobID=j.JobID 
+0

मैंने वास्तव में उन तालिकाओं को एक उदाहरण के रूप में बनाया है। मैं इस प्रकार की टेबल, टेबल में भागता हूं, थोड़ी देर में प्रत्येक बार समस्या में शामिल हो जाता हूं और मैं सोच रहा था कि वहां कोई ऐसी चीज है जहां मुझे पता नहीं था कि मेरी क्वेरी को पुन: व्यवस्थित करने के अलावा। – JerSchneid

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