PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como usar várias instruções WITH em uma consulta do PostgreSQL?


De acordo com os outros comentários, a segunda expressão de tabela comum [CTE] é precedida por uma vírgula e não por uma instrução WITH, portanto
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
    cte1 c1
    INNER JOIN cte2 c2
    ON ........

Em termos de sua consulta real, essa sintaxe deve funcionar no PostgreSql, Oracle e sql-server, bem mais tarde, normalmente você prosseguirá WITH com ponto e vírgula (;WTIH ), mas isso ocorre porque normalmente o pessoal do sql-server (inclusive eu) não encerra as instruções anteriores que precisam ser encerradas antes de um CTE ser definido ...

Observe, no entanto, que você teve um segundo problema de sintaxe em relação ao seu WHERE demonstração. WHERE date IN table_2 não é válido porque você nunca faz referência a um valor/coluna da tabela_2. Eu prefiro INNER JOIN sobre IN ou Exists então aqui está uma sintaxe que deve funcionar com um 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
;

Se você quiser manter o jeito que você tinha, que normalmente EXISTS seria melhor que IN, mas para usar IN você precisa de uma instrução SELECT real em seu where.
SELECT * 
FROM
     table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);

IN é muito problemático quando date poderia ser NULL então se você não quiser usar um JOIN então sugiro EXISTS . Do seguinte modo:
SELECT * 
FROM
     table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);