अन्य टिप्पणियों के अनुसार दूसरी सामान्य तालिका अभिव्यक्ति [सीटीई] एक अल्पविराम से पहले है, न कि बयान के साथ
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
आपकी वास्तविक क्वेरी के संदर्भ में इस सिंटैक्स को PostgreSql, Oracle, और sql-server में काम करना चाहिए, बाद में आमतौर पर आप WITH
आगे बढ़ेंगे अर्धविराम के साथ (;WTIH
), लेकिन ऐसा इसलिए है क्योंकि आम तौर पर एसक्यूएल-सर्वर लोग (स्वयं शामिल) पिछले बयानों को समाप्त नहीं करते हैं जिन्हें सीटीई परिभाषित होने से पहले समाप्त करने की आवश्यकता होती है ...
हालांकि ध्यान दें कि आपके WHERE
. के संबंध में आपके पास दूसरी सिंटैक्स समस्या थी बयान। WHERE date IN table_2
मान्य नहीं है क्योंकि आप वास्तव में कभी भी तालिका_2 से किसी मान/स्तंभ का संदर्भ नहीं देते हैं। मुझे पसंद है INNER JOIN
IN
. से अधिक या Exists
तो यहां एक सिंटैक्स है जो JOIN
. के साथ काम करना चाहिए :
WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)
, table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)
SELECT *
FROM
table_1 t1
INNER JOIN
table_2 t2
ON t1.date = t2.date
;
यदि आप उस तरह से रखना चाहते हैं जो आपके पास था, जो आम तौर पर EXISTS IN से बेहतर होगा, लेकिन IN का उपयोग करने के लिए आपको अपने स्थान पर एक वास्तविक SELECT स्टेटमेंट की आवश्यकता होगी।
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
जब date
. में IN बहुत समस्या होती है संभावित रूप से NULL
हो सकता है इसलिए यदि आप JOIN
. का उपयोग नहीं करना चाहते हैं तो मैं सुझाव दूंगा EXISTS
. इस प्रकार है:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);