SELECT "SURVEY_ID", "SURVEY_TITLE", "SURVEY_CONTENT", "SURVEY_REGDATE", "SURVEY_ENDDATE", "USER_NAME", "SURVEY_CNT", "SURVEY_CHECK" FROM( select survey.*, users_survey.SURVEY_CHECK from survey, users_survey where survey.survey_id = users_survey.survey_id) where rownum <= 10 order by survey_regdate desc;
현재 join 공부중에 있습니다. survey 테이블과 users_survey 테이블을 조인해서 맞는 건지는 모르겠지만... 값을 가져오는데 성공은 했습니다. 그런데 추가적으로 Question이라는 테이블의 question_type 을 survey 테이블에 조인해야하는 상황인데 테이블 3개의 조인은 전체적으로 이해가 너무 어렵습니다... 혹시 조금 쉽게 설명해주실 수 있을까요?
select DISTINCT
S.SURVEY_ID,
S.SURVEY_TITLE,
S.SURVEY_CONTENT,
S.SURVEY_REGDATE,
S.SURVEY_ENDDATE,
S.USER_NAME,
S.SURVEY_CNT,
U.SURVEY_CHECK,
Q.QUESTION_TYPE
FROM survey s
inner join users_survey u
on s.survey_id = u.survey_id
INNER join question q
on s.survey_id = q.survey_id;
혹시 이런 쿼리가 맞을까요?? 값은 제대로 나오는 것 같은데... 확신이 안서네요 ㅠㅠ
1. INNER JOIN이 여러개일 경우 순차적으로 생각하시면 됩니다. (사실 순서에 관계없이 결과는 항상 동일하며 사칙연산의 곱셈이라고 보시면 됩니다. (A * B) * C = A * (B * C) )
survey 테이블과 users_survey 테이블을 조인한 결과를 테이블 자체로 생각하시고 question 테이블과 조인한다고 보시면 됩니다.
2. INNER JOIN에서 중복된 값이 있을 경우에는 테이블과 테이블의 관계를 보셔야 합니다.
JOIN 조건으로 주신 s.survey_id = u.survey_id 또는 s.survey_id = q.survey_id 기준으로 테이블의 데이터 관계가 1:1인지 1:N인지 N:M인지를 보시면 되는데
N:M일 경우에는 결과에 중복 데이터가 존재합니다.
마농님 답변 정말 감사합니다. 공부할수록 어려운 세계네요 db의 세상이란...
중복값이 나오는 이유를 잘 모르겠습니다... 단순히 제 생각으로는 위 쿼리를 실행할 때 survey_id가 1이라고 가정하면 같은 survey_id 값을 가진 question_id가 2개가 존재하여 위 쿼리를 사용하면 2개의 survey_id 값이 뽑혀나오는건가 라고 생각했봤는데 혹시 다른 이유일까요?
우선은 당장 해결하기가 어려워 DISTINCT를 사용했습니다...
축구쟁이님 자세한 설명 답변 정말 감사합니다.
아직도 조금은 이해하기 어렵지만 그래도 훨씬 많이 이해할 수 있었습니다! 정말 감사합니다! 조금 더 노력해서 완벽히 이해할 수 있도록 공부하겠습니다!