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);