코드설명
INNER JOIN 을 활용합니다.
먼저, 문제에 주어진 Product와 Sales의 관계, 참여특성, 연관관계의 주인에 대하여 알아봅니다.
먼저, 연관관계의 주인은 Product가 주인, Sales가 자식인것을 알 수 있습니다.
Product의 PK가 Sales의 FK이니 말이죠.
비식별자 관계임 또한 알 수 있습니다. Sales의 PK에 Product_id가 없습니다. (비식별자 관계는 ERD에서 점선으로 연결)
관계는 1 : N 인 것을 알 수 있습니다. 하나의 Product에 여러 Year들이 존재하므로, 여러 Sales Record가 존재합니다.
참여특성은 Product는 Sales 가 없어도 되니, Sales는 선택적 참여특성입니다.( ERD에서는 Sales Entity 쪽에 O 표시)
Sales는 Product가 반드시 있어야 관계가 성립하니, Product는 필수적 참여특성입니다. (ERD에서는 Product Entity 쪽에 표시)
이렇게 테이블을 분석하면, 아래와 같이 간단하게 문제를 해결합니다.
JOIN 없이 SELECT-LIST에 Scalar Subquery를 사용하면 되지 않을까 싶습니다.
SELECT P.PRODUCT_ID
,(SELECT S.YEAR FROM SALES S WHERE S.PRODUCT_ID = P.PRODUCT_ID)
,(SELECT S.PRICE FROM SALES S WHERE S.PRODUCT_ID = P.PRODUCT_ID)
FROM PRODUCT P
WHERE P.PRODUCT_ID
하지만 Subquery retunrs more than 1 row Error가 뜹니다. 각 Product_ID 당 여러 Year에 대한 정보가 나오므로 안됩니다.
Year 컬럼이 1:N 관계를 나타내기에 이런일이 발생하는 것이라고 알 수 있습니다. 즉, 하나의 product_id에 대해 Sales 테이블에 여러 year와 price가 기록될 수 있기에 그렇습니다.
MYSQL 코드
SELECT P.PRODUCT_NAME, S.YEAR, S.PRICE
FROM PRODUCT P , SALES S
WHERE P.PRODUCT_ID = S.PRODUCT_ID