ตามความคิดเห็นอื่น ๆ 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