반응형
하나의 PostgreSQL 쿼리에서 여러 WITH 문을 사용하는 방법은 무엇입니까?
WITH 문을 사용하여 효과적으로 여러 TEMP 테이블이 무엇인지 "선언"하고 싶습니다. 실행하려는 쿼리는 다음과 같습니다.
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
PostgreSQL 문서를 읽고 여러 WITH
문 을 사용하는 방법을 조사 했지만 답을 찾을 수 없었습니다.
다른 주석마다 두 번째 공통 테이블 표현식 [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 사용자 (자신 포함)가 끝나지 않기 때문입니다. 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);
IN 때 매우 문제가 date
잠재적으로 수 NULL
당신이 사용하지 않을 경우, 그래서 JOIN
나는이 제안 EXISTS
. 다음과 같이 :
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
반응형
'Programing' 카테고리의 다른 글
자바 스크립트에서 이중 괄호의 의미와 액세스 방법 (0) | 2020.12.30 |
---|---|
Java 8-지루한 수집 방법 생략 (0) | 2020.12.30 |
TypeScript에서 스위치 블록이 완전한지 어떻게 확인합니까? (0) | 2020.12.30 |
asp.net 웹 메소드와 wcf 서비스의 차이점은 무엇입니까? (0) | 2020.12.30 |
이벤트 처리기에 추가 매개 변수를 전달하는 C #? (0) | 2020.12.30 |