Sql

[PostgreSQL] LATERAL Subqueries

댕주 2023. 9. 8. 11:13

서브쿼리에서 외부 칼럼을 참조하고 싶으면 어떻게 해야 할까?

서브쿼리는 독립적이기 때문에, 다른 FROM에 속한 항목들을 참조할 수는 없다.

하지만 !! FROM절에 있는 서브쿼리에서는 LATERAL 키워드를 이용하면 언제든지 가능하다.

 

SELECT *
  FROM A,
  LATERAL (
  	SELECT *
      FROM B
     WHERE A.id = B.id
  ) BB;
  
SELECT *
  FROM A, B
 WHERE A.id = B.id;

 

다른 FROM절의 항목을 이용할 수 있기 때문에, 첫 번째 구문처럼 사용할 수도 있지만...

굳이 LATERAL을 이용하지 않고도 두 번째 구문처럼 더 간단하게 동일한 결과를 얻을 수 있다.

 

 

하지만 LEFT JOIN과 LATERAL 서브쿼리를 함께 사용하면 JOIN 조건으로 서브쿼리 밖에 있는 칼럼을 사용할 수 있기 때문에 무척 유용하다.

 

SELECT manufacturers.manufacturer_name, products.product_name
  FROM manufacturers
  LEFT JOIN LATERAL (
        SELECT product_name
          FROM products
         WHERE products.manufacturer_id = manufacturers.manufacturer_id
         ) AS products ON TRUE
 WHERE products.product_name IS NULL;

 

이 쿼리에서 "LATERAL" 서브쿼리는 각 제조사에 대해 해당 제조사가 생산한 제품의 이름을 가져온다.

그런 다음 LEFT JOIN을 사용하여 제조사와 연결하고,

"WHERE products.product_name IS NULL" 조건을 사용하여 제조사가 아무 제품도 생산하지 않는 경우를 필터링을 한다.

결과적으로, 아무 제품도 생산하지 않는 제조사의 목록을 반환하게 된다.

 

이처럼 LEFT JOIN 하고 싶은 테이블의 전체가 필요한 것도 아니고,

특정 칼럼만 필요할 때 LATERAL 키워드를 이용하는 것이 큰 도움이 될 것이다.

 

'Sql' 카테고리의 다른 글

[MyBatis] MyBatis와 @Builder 사용 시 resultMap 매핑 문제 해결하기  (0) 2024.10.27
[PostgreSQL] RETURNING  (0) 2023.09.08
[PostgreSQL] UPSERT  (0) 2023.09.08