एक PostgreSQL क्वेरी में कथनों के साथ कई का उपयोग कैसे करें?


105

मैं "घोषणा" करना चाहूंगा कि प्रभावी ढंग से एकाधिक TEMP तालिकाओं का उपयोग क्या है। मैं जिस क्वेरी को निष्पादित करने की कोशिश कर रहा हूं वह है:

WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)

WITH table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)

SELECT * FROM table_1
WHERE date IN table_2

मैंने PostgreSQL प्रलेखन पढ़ा है और कई WITHबयानों का उपयोग करने में शोध किया है और एक उत्तर खोजने में असमर्थ था।


दूसरे withकथन से पहले किसी भी अन्य के बाद अल्पविराम आज़माएं । पोस्टग्रेज के बारे में निश्चित नहीं है, लेकिन यह Oracle और sql सर्वर के साथ सामान्य वाक्यविन्यास है
msheikh25

मैंने अल्पविराम और बाद में अर्धविराम का उपयोग करने की कोशिश की और अभी भी वाक्यविन्यास त्रुटियां थीं: ERROR: syntax error at or near "WITH"अल्पविराम के ERROR: syntax error at or near ";"लिए और अर्धविराम के लिए।
ग्रेग

जवाबों:


167

अन्य टिप्पणियों के अनुसार दूसरा कॉमन टेबल एक्सप्रेशन [सीटीई] एक अल्पविराम से पहले का है, ऐसा कथन नहीं है

WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
    cte1 c1
    INNER JOIN cte2 c2
    ON ........

आपकी वास्तविक क्वेरी के संदर्भ में इस वाक्यविन्यास को PostgreSql, Oracle, और sql-server में काम करना चाहिए, अच्छी तरह से बाद में आम तौर पर आप WITHअर्धविराम ( ;WTIH) के साथ आगे बढ़ेंगे , लेकिन ऐसा इसलिए है क्योंकि आमतौर पर sql-server लोग (खुद शामिल) समाप्त नहीं होते हैं पिछले बयानों को एक सीटीई से पहले समाप्त करने की आवश्यकता है जो परिभाषित किया जा रहा है ...

ध्यान दें कि आपके WHEREकथन के संबंध में आपके पास दूसरा वाक्यविन्यास मुद्दा है । WHERE date IN table_2मान्य नहीं है क्योंकि आप वास्तव में table_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 * 
FROM
     table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);

IN बहुत समस्याग्रस्त है जब dateसंभावित रूप से NULLऐसा हो सकता है यदि आप एक का उपयोग नहीं करना चाहते हैं JOINतो मैं सुझाव दूंगा EXISTS। निम्नलिखित नुसार:

SELECT * 
FROM
     table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);

मदद करने में खुशी। मैं IN का उपयोग नहीं करने पर लेख नहीं ढूँढ सकता, लेकिन मैं दृढ़ता से IN पर एक JOIN या EXISTS का उपयोग करने का सुझाव दूंगा। यदि आपके परिणाम में एक अशक्त मौजूद है तो क्या होता है, आपको हर रिकॉर्ड मिलेगा, न कि केवल वे जो आप चाहते हैं। यह अजीब है लेकिन यह सबसे अधिक RDBMs के काम करने का तरीका है। उस पर एक खोज की जाँच करने की कोशिश करें, मुझे पता है कि मैंने जो अच्छा जवाब देखा था, वह इस साइट पर भी था ... वैसे भी, एक अच्छी रात है
मैट

8

आप कथन के साथ अपने परिणामों की श्रृंखला भी बना सकते हैं। उदाहरण के लिए:

WITH tab1 as (Your SQL statement),
tab2 as ( SELECT ... FROM tab1 WHERE your filter),
tab3 as ( SELECT ... FROM tab2 WHERE your filter)
SELECT * FROM tab3;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.