आप स्पष्ट जुड़ाव के साथ अंतर्निहित जोड़ मिला रहे हैं। इसकी अनुमति है, लेकिन आपको इस बात की जानकारी होनी चाहिए कि इसे ठीक से कैसे किया जाए।
बात यह है कि, स्पष्ट जुड़ाव (वे जो JOIN
. का उपयोग करके कार्यान्वित किए जाते हैं) कीवर्ड) निहित लोगों पर वरीयता लेते हैं ('अल्पविराम' जुड़ता है, जहां जुड़ने की स्थिति WHERE
में निर्दिष्ट होती है। खंड)।
यहां आपकी क्वेरी की रूपरेखा दी गई है:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
आप शायद उम्मीद कर रहे हैं कि यह इस तरह का व्यवहार करेगा:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
यानी, तालिकाओं का संयोजन a
और b
dkcd
तालिका के साथ जुड़ा हुआ है . दरअसल, जो हो रहा है वह है
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
यानी जैसा कि आप पहले ही समझ चुके होंगे, dkcd
विशेष रूप से b
. के विरुद्ध शामिल हुआ है और केवल b
, तो शामिल होने के परिणाम को a
. के साथ जोड़ दिया जाता है और WHERE
. के साथ आगे फ़िल्टर किया गया खंड। इस मामले में, a
. का कोई भी संदर्भ ON
. में खंड अमान्य है, a
उस समय अज्ञात है। इसलिए आपको त्रुटि संदेश मिल रहा है।
अगर मैं तुम होते, तो शायद मैं इस प्रश्न को फिर से लिखने की कोशिश करता, और एक संभावित समाधान हो सकता है:
SELECT DISTINCT
a.maxa,
b.mahuyen,
a.tenxa,
b.tenhuyen,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
LEFT OUTER JOIN (
SELECT
maxa,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011'
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
ORDER BY a.maxa
यहां टेबल a
और b
पहले जुड़ते हैं, फिर परिणाम dkcd
. से जुड़ जाते हैं . मूल रूप से, यह आपकी जैसी ही क्वेरी है, केवल एक जॉइन के लिए एक अलग सिंटैक्स का उपयोग करना, जो एक बहुत बड़ा अंतर बनाता है:संदर्भ a.maxa
dkcd
. में की शामिल होने की शर्त अब बिल्कुल मान्य है।
जैसा कि @Aaron बर्ट्रेंड ने सही ढंग से नोट किया है, आपको संभवतः maxa
qualify के योग्य होना चाहिए एक विशिष्ट उपनाम के साथ, शायद a
, ORDER BY
. में खंड।