Data Engineering
[SQLD 자격검정 실전문제] Part 2-1. 88번 적절한 배치작업 구현 SQL 찾기
햣둘
2025. 6. 13. 07:57
정답 : 4번
특정 고객(CUSTID)에게 추천한 컨텐츠를 조회하는 쿼리임.
단, 고객이 비선호로 표시한 컨텐츠는 제외함.
비선호 컨텐츠를 제외하기 위해서는 NOT EXISTS를 사용하며, 이 때 특정 고객이 비선호하는 것만 조회해야 함.
[테이블 관계 설명]
- 고객은 추천 컨텐츠를 받을 수 있으며, 추천 컨텐츠는 추천 대상일자에 맞춰 관리됨
- 비선호 컨텐츠는 고객이 선호하지 않는 컨텐츠를 정의하여 특정 조건에서 제외해야 함
- 고객에게 추천 컨텐츠를 제공할 때, 비선호 컨텐츠로 등록된 컨텐츠는 제외해야 함
# 테이블 삭제
DROP TABLE 비선호컨텐츠;
DROP TABLE 추천컨텐츠;
DROP TABLE 컨텐츠;
DROP TABLE 고객;
# 테이블 생성
CREATE TABLE 고객 (
고객ID VARCHAR2(20) PRIMARY KEY,
고객명 VARCHAR2(100),
나이 NUMBER
);
CREATE TABLE 컨텐츠 (
컨텐츠ID VARCHAR2(20) PRIMARY KEY,
컨텐츠명 VARCHAR2(100)
);
CREATE TABLE 추천컨텐츠 (
고객ID VARCHAR2(20),
컨텐츠ID VARCHAR2(20),
추천대상일자 VARCHAR2(10),
CONSTRAINT pk_추천컨텐츠 PRIMARY KEY (고객ID, 컨텐츠ID),
CONSTRAINT fk_추천컨텐츠_고객 FOREIGN KEY (고객ID) REFERENCES 고객(고객ID),
CONSTRAINT fk_추천컨텐츠_컨텐츠 FOREIGN KEY (컨텐츠ID) REFERENCES 컨텐츠(컨텐츠ID)
);
CREATE TABLE 비선호컨텐츠 (
고객ID VARCHAR2(20),
컨텐츠ID VARCHAR2(20),
등록일시 VARCHAR2(10),
CONSTRAINT pk_비선호컨텐츠 PRIMARY KEY (고객ID, 컨텐츠ID),
CONSTRAINT fk_비선호컨텐츠_고객 FOREIGN KEY (고객ID) REFERENCES 고객(고객ID),
CONSTRAINT fk_비선호컨텐츠_컨텐츠 FOREIGN KEY (컨텐츠ID) REFERENCES 컨텐츠(컨텐츠ID)
);
# 테스트 데이터
INSERT INTO 고객 VALUES ('CUST01', '김고객', 30);
INSERT INTO 컨텐츠 VALUES ('CONT01', '추천컨텐츠1');
INSERT INTO 컨텐츠 VALUES ('CONT02', '추천컨텐츠2');
INSERT INTO 추천컨텐츠 VALUES ('CUST01', 'CONT01', '2024.01.25');
INSERT INTO 추천컨텐츠 VALUES ('CUST01', 'CONT02', '2024.01.25');
INSERT INTO 비선호컨텐츠 VALUES ('CUST01', 'CONT02', '2024.01.25');
# 쿼리 실행
SELECT C.컨텐츠ID, C.컨텐츠명
FROM 고객 A
INNER JOIN 추천컨텐츠 B ON (A.고객ID = 'CUST01' AND A.고객ID = B.고객ID)
INNER JOIN 컨텐츠 C ON (B.컨텐츠ID = C.컨텐츠ID)
WHERE B.추천대상일자 = '2024.01.25'
AND NOT EXISTS (
SELECT X.컨텐츠ID
FROM 비선호컨텐츠 X
WHERE X.고객ID = B.고객ID
AND X.컨텐츠ID = B.컨텐츠ID
);