PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да използвате няколко израза WITH в една заявка на PostgreSQL?

Според другите коментари вторият общ израз на таблицата [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-сървър (включително и аз) не приключват предишни изрази, които трябва да бъдат приключени, преди да бъде дефиниран 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 във вашето where.

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

IN е много проблематичен, когато date потенциално може да бъде NULL така че ако не искате да използвате JOIN тогава бих предложил EXISTS . както следва:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. интернационализиран регулярен израз в postgresql

  2. Хибернация на картографиране между PostgreSQL enum и Java enum

  3. Rails 3, ActiveRecord, PostgreSQL - командата .uniq не работи?

  4. Как да използвате pgBackRest за архивиране на PostgreSQL и TimescaleDB

  5. Как да възстановите непоследователен PostgreSQL Slave