2016-07-01 13 views
22

WITH ifadesini kullanarak birden çok TEMP tablosunu etkin olarak "bildirmek" istiyorum. Ben yürütmeye çalışıyorum sorgu çizgisinde: Ben PostgreSQL documentation okuyup araştırılmış multipl WITH ifadelerini kullanarak içine ve bir cevap bulamadı ettikBir PostgreSQL sorgusunda çoklu WITH deyimleri nasıl kullanılır?

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 

. İkinci Ortak Tablo İfade [CTE] virgül öncesinde diğer yorumlarla Başına

+0

İkinci 'with' ifadesinden önce virgülle çalışın. Postgres hakkında emin değilim ama bu Oracle ve sql server – mo2

+0

ile normal sözdizimi bir virgül ve daha sonra bir noktalı virgül kullanmayı denedim ve hala sözdizimi hataları vardı: 'HATA:" WITH "veya virgül ve" HATA "için sözdizimi hatası noktalı virgül için "veya" yakınında veya sözdizimi hatası. – Greg

cevap

39

değil gerçek sorguda açısından açıklamada böylece

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

İLE bu sözdizimi PostgreSQL, Oracle ve sql içinde çalışması gerekir -server, daha sonra genellikle bir noktalı virgülle (;WTIH) WITH ilerleyecektir, ancak genellikle sql-sunucu millet (kendimi dahil) tanımlanmış bir CTE önce bitmesi gereken önceki ifadeleri sona ermez çünkü bu ..

Ancak, yo ile ilgili ikinci bir sözdizimi sorununuz olduğunu unutmayın. WHERE bildirimi. WHERE date IN table_2 geçerli değil çünkü tablo_2'den bir değere/sütuna hiçbir zaman gerçekten başvurmuyorsunuz. Ben IN ya işte Exists üzerinde INNER JOIN tercih ile çalışmalıdır bir sözdizimi bir 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 
; 

genellikle IN daha iyi olurdu MEVCUT mıydın şekilde tutmak için ama size İÇİNDE kullanmak istiyorsanız Bulunduğunuz yerde gerçek bir SELECT ifadesine ihtiyacınız var. Bir JOIN sonra EXISTS öneririm kullanmak istemiyorsanız eğer öyleyse date potansiyel NULL olabilecekken

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

İÇİNDE çok problemlidir. Aşağıdaki gibidir:

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

Derinlemesine açıklama için teşekkür ederiz, sözdizimi :) – Greg

+0

yardımcı olmak için çalıştı. IN kullanmayan makaleyi bulamıyorum, ancak IN üzerinde bir JOIN veya EXISTS kullanmanızı şiddetle tavsiye ederim. Sonuç kümenizde bir null varsa, ne olursa olsun, her kaydı sadece sizin istediklerinizi değil alırsınız. Bu garip ama çoğu RDBM çalışmaktadır. Üzerinde bir arama yapmayı deneyin, ben de bu sitede olduğunu gördüm iyi cevabı biliyorum ... yine de, iyi bir gece var – Matt

+0

bana çok zaman kazandı adam, teşekkür ederim! – Juan

İlgili konular