SQL

SQL 테이블 행연결 응용

봄다온 2025. 2. 5. 12:38

소속 테이블 표현하며 결합

AS를 사용하여 새로운 칼럼 및 값을 추가하여 결합
# ramen
 id |    name    | quantity | is_spicy | shelf_life
----+------------+----------+----------+------------
  1 | 진라멘     |        2 | f        |         90
  2 | 고추짜장면 |       15 | f        |         30
  3 | 리얼짬뽕   |       47 | t        |         40
  4 | 추풍라면   |       18 | f        |         90
  5 | 겨울이라면 |       50 | t        |         60
(5 rows)

# drink
 id |     name     | quantity | shelf_life | volume
----+--------------+----------+------------+--------
  1 | 에너지드링크 |       36 |         30 |    300
  2 | 오렌지주스   |       38 |         25 |   1500
  3 | 무안단물     |       41 |         35 |    600
  4 | 순진맥주     |       47 |         60 |    900
  5 | 더맛         |        3 |         35 |   1000
(5 rows)

# canned_food
 id |   name    | quantity | weight
----+-----------+----------+--------
  1 | 참치      |       14 |    350
  2 | 고추참치  |        5 |    200
  3 | 연어      |        3 |    400
  4 | 곰과 연어 |       14 |    400
  5 | 삼치      |       50 |    450
(5 rows)

(
  select name, quantity, 'drink' as item_type
  from drink
)
union all
(
  select name, quantity, 'ramen' as item_type
  from ramen
)
union all
(
  select name, quantity, 'canned_food' as item_type
  from canned_food
)
order by quantity desc;
     name     | quantity |  item_type
--------------+----------+-------------
 겨울이라면   |       50 | ramen
 삼치         |       50 | canned_food
 리얼짬뽕     |       47 | ramen
 순진맥주     |       47 | drink
 무안단물     |       41 | drink
            (이하생략)
(15 rows)

서브쿼리 결합 후 조건사용1

item_list는 from절 이후의 서브쿼리 별칭이며 필수사용해야함

select item_type, array_agg(name) as name
from (
  (
    select name, quantity, 'drink' as item_type
    from drink
  )
  union all
  (
    select name, quantity, 'ramen' as item_type
    from ramen
  )
  union all
  (
    select name, quantity, 'canned_food' as item_type
    from canned_food
  )
) item_list
where quantity <= 20
group by 1;
  item_type  |               name
-------------+----------------------------------
 canned_food | {참치,고추참치,연어,"곰과 연어"}
 ramen       | {진라멘,고추짜장면,추풍라면}
 drink       | {더맛}
(3 rows)

서브쿼리 결합 후 조건사용2

다루는 정보의 양을 최소화한 이후 데이터를 결합하기때문에 성능이 더 좋다.

select item_type, array_agg as name
from(
  (
    select 'drink' as item_type, array_agg(name)
    from drink
    where quantity <= 20
    group by 1
  )
  union all
  (
    select 'ramen' as item_type, array_agg(name)
    from ramen
    where quantity <= 20
    group by 1
  )
  union all
  (
    select 'canned_food' as item_type, array_agg(name)
    from canned_food
    where quantity <= 20
    group by 1
  )
) item_list;
  item_type  |               name
-------------+----------------------------------
 drink       | {더맛}
 ramen       | {진라멘,고추짜장면,추풍라면}
 canned_food | {참치,고추참치,연어,"곰과 연어"}
(3 rows)