ตามความคิดเห็นอื่น ๆ Common Table Expression [CTE] ที่สองนำหน้าด้วยลูกน้ำไม่ใช่คำสั่ง WITH ดังนั้น
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
ในแง่ของการค้นหาจริงของคุณไวยากรณ์นี้ควรใช้งานได้ใน PostgreSql, Oracle และ sql-server โดยปกติแล้วคุณจะดำเนินการต่อWITHด้วยอัฒภาค ( ;WTIH) แต่นั่นเป็นเพราะโดยทั่วไปแล้ว sql-server folks (รวมตัวเองด้วย) ไม่จบ ข้อความก่อนหน้าซึ่งจำเป็นต้องสิ้นสุดก่อนที่จะมีการกำหนด CTE ...
อย่างไรก็ตามโปรดทราบว่าคุณมีปัญหาทางไวยากรณ์ที่สองเกี่ยวกับ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 จริงในตำแหน่งของคุณ
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);
withคำสั่งที่สองหลังจากนั้น ไม่แน่ใจเกี่ยวกับ postgres แต่เป็นไวยากรณ์ปกติของเซิร์ฟเวอร์ Oracle และ sql