2014-06-15 3 views
2

저는 현재 현재 학교에서 데이터베이스를 배우고 있습니다.하지만 유감스럽게도 선생님은 정말로 도움이나 질문에 대답하는 것을 전혀 즐기지 않습니다. 저는 현재 현재 몇 가지 오라클 DB 연습을하고 있습니다. 한 가지 질문에 대해 생각해 보았습니다. 해결 방법을 모르겠습니다.중복 제거 JOIN

표 1 학생

ID  FAMILY NAME  FIRST NAME BIRTH DATE  IM_DATE FACULTY 

4711 Lehmann   Heini   13.03.89  01.09.08  I   
    4712 Huber   Sven   14.07.89  01.09.08  IWI  
    4713 Meier   Swantje  11.04.88  01.03.09  IWI  
    4714 Tunix   Ole   15.03.88  01.03.09  IWI  
    4715 Kannix   Peter   02.11.89  01.03.09  IWI  
    4716 Weissnix   Axel   15.12.88  01.03.09  IWI  

표 2 : LN

ID FKBEZ   VNR P_DATE  GRADE 

0,123,516
4711 DB1   1 02.02.08  4,7 
    4711 DB1   2 07.07.09   5 
    4711 PR1   1 28.01.09   3 
    4712 DB1   1 02.02.08  3,7 
    4713 DB1   1 02.02.08  1,7 
    4713 DB2   1 02.02.09  3,7 
    4714 PR1   1 28.01.09   2 
    4715 DB1   1 02.02.08   5 
    4711 DB2   1 14.07.09  1,3 
    4711 PR2   1 30.06.09  2,3 

자, 다음은 질문입니다.

1 : 중복 행을 초래할 SQL 쿼리 (JOIN)를 생성하십시오. 질문 2 : 질문을 Q1에서 변경하면 중복 된 내용이 표시되지 않습니다.

여기 내 첫 번째 '문제'는 복제본의 정의가 무엇인지 100 % 확신하지 못한다는 것입니다. SELECT 명령에서 선택하지 않은 경우에도 모든 열에 100 % 동일한 내용의 중복 행이 있습니까?

예 : 말 내가 쿼리를 만든 내가 열 '가족 이름'내 SELECT 명령 '나이'내 결과를 선택한는 다음과 같습니다

Family Name   Age 

Miller    20 
Miller    20 

하지만 실제로는 서로 다른 두 명으로 이름이 다릅니다. 따라서 첫 번째 이름을 선택하지 않았기 때문에이를 표시하지 않거나 SELECT를 통해 선택한 항목이 중요하지 않으며 중복 행이 100 % 동일 할 경우에만 중복 항목으로 한정되므로 중복 항목으로 한정됩니까?

제 질문으로 돌아 가세요. 내가처럼 보이는 쿼리를 가입하는 간단한 (INNER)를 선택한 경우 Q1

학생들 S FROM SELECT S.ID, S.Family_Name, S.First_Name, LN.FKBEZ 는 S. ON LN 가입 ID = LN.ID는

FAMILY NAME    FIRST NAME    FKBEZ  (GRADE) 

Lehmann     Heini      DB1   4,7 
Lehmann     Heini      DB1   5 
Lehmann     Heini      PR1   3 
Huber      Sven      DB1   3,7 
Meier      Swantje     DB1   1,7 
Meier      Swantje     DB2   3,7 
Tunix      Ole      PR1   2 
Kannix     Peter      DB1   5 
Lehmann     Heini      DB2   1,3 
Lehmann     Heini      PR2   2,3 

이 결과이다. 내 질문에 '학년'을 선택하지 않았지만 목록을 작성해 두었으므로 내 질문을 조금 더 잘 이해할 수 있습니다. 이제 쿼리에서 'GRADE'를 선택하지 않았으므로 행 1 + 2가 중복 될 것으로 생각합니다. 열이 모두 동일하기 때문입니다. 그런 다음 Q2로 이동하여 똑같은 쿼리를 사용했습니다. NATURAL JOIN을 사용하여 이번에 만 (모든 중복 행을 제거하므로) 정확한 결과를 얻었습니다.

그래서 지금 내 결론은 행이 그들 만이 모든 볼 수'보이지 않는' 칼럼에 100 % 동일한 있다면 중복되는 것으로 간주한다는 것이다. 하지만 Q1 + Q2를 어떻게 풀어야할지 모르기 때문에 실제로 완전히 엉망입니다.

DISTINCT 또는 GROUP BY를 사용하여 이러한 질문을 해결하지 않아야한다는 것을 알아야합니다. JOINS, INTERSECT, UNION 및 MINUS 만 (다른 종류).

나는이 게시물을 작성하는데 많은 시간과 노력을 쏟았 음을 알 수 있습니다. 여러분이이 게시물을 도와 주시면 대단히 감사하겠습니다.

감사합니다.

+0

질문에 대한 이해를 바탕으로 수업이 도움이 될지 잘 모르겠습니다. –

+0

약간의 설명을 위해 강사를 괴롭힐 필요가 있다고 생각합니다. 최소한 열을 포함/제외하거나 조인에 열을 추가하는 첫 번째 "대답"에 대해 물어볼 수 있습니다. 중복되지 않은 행을 유지해야합니까? 'UNION'은 당신을 위해서'DISTINCT'를 수행 할 것입니다. 그래서 그것은 일종의 부정 행위입니다. 명시 적으로 GROUP BY 절을 추가하지 않고 최대/최소값을 얻을 수 있습니다 (부정 행위도 가능). 'INTERSECT' /'MINUS'는 세트에서 작동하기 때문에, 처음부터 중복 제거하지 않는 한 _all_ 행을 유용하게 유지/제거 할 것입니다. 'NATURAL JOIN' ='JOIN'은 조건이 있습니다. –

+0

... 나는 바보입니다. LEFT JOIN (모든 RDBMS에서 작동)을 사용하여이를 수행하는 방법을 잊어 버렸습니다. 중복을 찾거나 제거하는 방법은 [SO-1 그룹 당]에서 찾아보십시오. 하지만 직관적이지는 않습니다. 사람들은 보통 사람들에게 지적해야합니다. –

답변

-1

왼쪽 결합을 사용해보십시오. 해당 레코드에는 두 번째 테이블에 널값이 없습니다. Es. * t1, t2에서 선택하십시오. 여기서 t1은 왼쪽 t2에 합류합니다. t2의 일치하지 않는 값은 null이됩니다.

+0

'... from t1 left join t2 on ...'또는 '... from t1, t2 where ...' – Lennart

+0

과 같은 조인 스타일을 혼합합니다. 미안하지만 그것은 'Custom'입니다. * t1.column = t2.column에서 t1 join t2를 선택하십시오. – 101

+0

'LEFT JOIN', 'INNER JOIN', 뭐든지간에, 그의 문제는 실제로 가입 유형이 아닙니다 ... –