কিভাবে একটি পোস্টগ্রিজ এসকিউএল কোয়েরিতে একাধিক WITH বিবৃতি ব্যবহার করবেন?


96

আমি WITH বিবৃতিটি ব্যবহার করে কার্যকরভাবে একাধিক 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

আমি পোস্টগ্রেএসকিউএল ডকুমেন্টেশন পড়েছি এবং একাধিক WITHবিবৃতি ব্যবহার করে গবেষণা করেছি এবং উত্তর খুঁজে পেতে অক্ষম।


দ্বিতীয় withবিবৃতি দেওয়ার আগে কমা দিয়ে চেষ্টা করুন অন্য কোনও পরে।
পোস্টগ্রাস

আমি একটি কমা এবং পরে একটি সেমিকোলন ব্যবহার করার চেষ্টা করেছি এবং এখনও সিনট্যাক্স ত্রুটি ছিল: ERROR: syntax error at or near "WITH"কমা এবং ERROR: syntax error at or near ";"সেমিকোলনের জন্য।
গ্রেগ

উত্তর:


155

অন্যান্য মন্তব্য অনুসারে দ্বিতীয় সাধারণ টেবিল এক্সপ্রেশন [সিটিই] এর আগে কমা একটি বিবৃতির সাথে নয়

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

আপনার প্রকৃত ক্যোয়ারীর ক্ষেত্রে এই বাক্য গঠনটি পোস্টগ্রেএসকিএল, ওরাকল এবং এসকিএল-সার্ভারে কাজ করা উচিত, তবে পরে সাধারণত আপনি 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
;

আপনি যদি রাখেন এমনভাবে রাখতে চান যা সাধারণত উপস্থিত থাকে যা IN এর চেয়ে ভাল তবে IN ব্যবহার করার জন্য আপনাকে আপনার যেখানে সত্যিকারের নির্বাচনী বিবৃতি প্রয়োজন।

SELECT * 
FROM
     table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);

আমি খুব সমস্যাযুক্ত যখন dateসম্ভাব্য হতে পারে NULLতাই আপনি যদি একটি ব্যবহার করতে না চান JOINতবে আমি পরামর্শ দেব EXISTS। নিম্নরূপ:

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

4
গভীরতার ব্যাখ্যার জন্য আপনাকে ধন্যবাদ, সিনট্যাক্সটি কাজ করেছে :)
গ্রেগ

সাহায্য করে আনন্দ পেলাম. IN ব্যবহার না করার বিষয়ে আমি নিবন্ধটি খুঁজে পাচ্ছি না তবে আমি দৃ strongly়ভাবে IN এর মধ্যে একটি JOIN বা বিদ্যমান থাকা ব্যবহারের পরামর্শ দেব। যদি আপনার ফলাফলটিতে কোনও নাল উপস্থিত থাকে তবে যা ঘটে তা হ'ল আপনি যা চান তা নয় প্রতি রেকর্ডটি পাবেন। এটি অদ্ভুত তবে বেশিরভাগ আরডিবিএম কাজ করে। এটিতে অনুসন্ধানের চেষ্টা করে দেখুন, আমি এই সাইটে খুব ভাল উত্তর পেয়েছি তা আমি জানি ... যাইহোক, শুভ রাত্রি দিন
ম্যাট

5

আপনি WITH বিবৃতি ব্যবহার করে আপনার ফলাফলগুলি চেইন করতে পারেন। যেমন:

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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.