POSTGRESQL에 관한 질문입니다. 테이블간 비교 FUNCTION 질문. #내용 수정하였습니다 0 4 834

by 레거시 입문자 POSTGRESQL [2019.08.30 11:47:25]


현재 FUNCTION문을 통해, 두 테이블의 간의 특정값을 기준으로 하여 비교를 하려는 FUNCTION을 만들려고 하는데요...

감을 못잡겠다보니.... 조언을 좀 부탁드리겠습니다 ㅠㅠ

비교 조건

- A와 B 테이블의 특정 값을 기준으로 하여 비교를 한다.

- 이 때 특정 값은 A테이블과 B테이블의 명칭이 다를 수 있으며, 해당 이름을 지닌 데이터끼리 비교한다.

- 비교 시, 이름은 그저 키가 되는 것으로서 일치하는 요소가 아닌 해당 이름을 지닌 데이터를 가지고 오는 용도로서 사용된다.

- 데이터 비교 시 비교가 되는 키는 일련번호 원산지 출하지로 하며 해당 값을 비교했을 때 완전히 일치하는 내용이 존재한다면 가져오도록 한다.

EX)

A 테이블

NAME SUB_NAME 일련번호 원산지 출하지  
채소 S0010 대한민국 강원도  
채소 배추 S0020 대한민국 부산  
채소 오이 S0030 대한민국 인천  
채소 호박 S0040 대한민국 인천  

B 테이블

 

NAME 일련번호 PRICE 원산지 출하지
고랭지배추 S0020 25000 대한민국 부산
고랭지배추 S0178 2300 수입 강원도
어딘가의 배추 S0179 2150 수입 강원도
배추 S0020 12590 대한민국 부산

 

 

즉, 실제 FUNCTION 기동문은 다음과 같이 되게 하고 싶습니다.

SELECT * FROM [FUNCTION_NAME] (A 테이블, B 테이블)

= 비교 결과값

SUB_NAME 일련번호 원산지 출하지 NAME 일련번호 원산지 출하지

SUB_NAME 일련번호 원산지 출하지 NAME 일련번호 원산지 출하지
배추 S0020 대한민국 부산 고랭지배추 S0020 대한민국 부산
배추 S0020 대한민국 부산 배추 S0020 대한민국 부산

조언해주시는 점에 있어 부족한 설명이 있다면, 말씀해주세요 추가하겠습니다.

이상, 잘 부탁드립니다. 항상 감사합니다.

 

#조금 설명이 모호하고 조건이 애매하여 알기 힘드실 것 같아 내용을 조금 수정하였습니다

 

 

by 소주쵝오 [2019.08.30 13:31:46]

위 예제에서 함수의 입력값으로 (채소, 고랭지배추) 를 넣었는데 결과 데이터의 관계를 알 수가 없네요~

채소랑 고랭지배추 랑 무슨 관계인거죠?


by 레거시 [2019.08.30 14:03:11]

수정한 내용에 맞추어 설명을 추가드리자면

SUB_NAME/일련번호/원산지/출하지 가 A테이블에 해당하며

NAME / 일련번호 / 원산지 / 출하지 가 B테이블에 해당합니다

이 테이블을 비교 시 일련번호와 원산지 출하지로 비교하여 값을 가져옵니다.

원하시는 답변이 이게 맞을지 모르겠네요..

# 테이블 비교 방식도 수정하였습니다

(채소, 고랭지배추) -> (A 테이블, B 테이블)로 수정하였습니다)


by 소주쵝오 [2019.08.30 15:10:58]
아.. 수정하여 문의 주신 내용에서 대해서는 저도 잘 모르겠네요~ ^^;;
처음에 문의 주셨던 것에 대한 내용은 아래처럼 해보았습니다.
참고해보세요~

-- A테이블생성
create table A
( nm varchar(100)
, gb varchar(100)
, price bigint
, orgin varchar(100))
;

-- B테이블생성
create table B
( nm varchar(100)
, price bigint
, orgin varchar(100))
;

-- A, B 데이터 삽입
insert into A values('채소', '무', 1000, '대한민국');
insert into A values('채소', '배추', 2000, '대한민국');
insert into A values('채소', '오이', 3000, '대한민국');
insert into A values('채소', '호박', 4000, '대한민국');

insert into B values('고랭지배추', 2000, '수입');
insert into B values('채소', 2350, '대한민국');
insert into B values('어딘가의배추', 1000, '수입');
insert into B values('채소', 1500, '수입');

-- 함수에서 return할 타입
CREATE TYPE A_B_return_type as 
( a_nm varchar
, a_gb varchar
, a_price bigint
, a_orgin varchar
, b_nm varchar
, b_price bigint
, b_orgin varchar)
);

-- FN_AB 함수 생성
create or replace function FN_AB (a_nm varchar, b_nm varchar)
returns setof A_B_return_type
as
$$
    select A.*
         , B.*
    from A 
       , B
    where A.nm = a_nm 
    and B.nm = b_nm
    and A.price = B.price;
$$
language sql;
			 

-- 조회
select * from FN_AB('채소', '고랭지배추');

 


by 레거시 [2019.08.30 15:18:51]

답변 감사드립니다 한번 참고하여 알아보도록 하겠습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입