2013-07-01 1 views
0

외부 조인에 대한 초보자 질문이 있습니다. 다음과 같은 구조의 테이블이 5 개 있습니다.mysql에서 외부 조인을 사용하여 자식 테이블에 가입

employee (employee_id, name, address) 
employee_benefits (employee_id, benefit_id, join_date) 
insurance (insurance_id, name) 
insurance_benefits (insurance_id, benefit_id) 
benefit (benefit_id, title) 

특정 종업원의 경우 종업원에게 제공되는 전체 또는 일부 혜택 세트와 일치하는 혜택을 포함한 모든 보험을 선택해야합니다. 예 : 직원 I 혜택의 전체 목록 또는 직원 보유 혜택의 일부 중 하나가 모든 보험을 선택하지만, 직원 보유하지 혜택을 인스턴스를 포함하지 않도록해야 할 123에 대한

benefit(
    bn1, 1st benefit; 
    bn2, 2nd benefit; 
    bn3, 3rd benefit; 
    bn4, 4th benefit; 
) 

employee(
    123, bill jones, 123 main st; 
    321, alex baldwin, 222 state st; 
) 

employee_benefits(
    123, bn1; 
    123, bn2; 
    123, bn4; 
    321, bn3; 
    321, bn4; 
) 

insurance(
    ins1, 1st insurance; 
    ins2, 2nd insurance; 
    ins3, 3rd insurance 
) 

insurance_benefits(
    ins1, bn1; 
    ins1, bn2; 
    ins2, bn1; 
    ins2, bn3; 
    ins2, bn4; 
    ins3, bn2; 
    ins3, bn4; 
) 

. 위의 예에서는 ins1 및 ins3이됩니다.

위의 작업을 수행하기 위해 외부 조인을 사용하는 방법이 있습니까?

+0

희망이 도움이 될 수 있습니다. http://stackoverflow.com/questions/11064913/achie ve-hierarchy-parent-child-relationship-in-effective-and-easy-way –

답변

0

외부 조인으로이 작업을 수행 할 수 있지만, 서브 쿼리와 함께 IN -clauses를 사용하는 것이 더 직관적이라고 생각합니다. 위의 혜택을 제공하지 않습니다

SELECT DISTINCT insurance_id 
    FROM insurance_benefits 
WHERE benefit_id NOT IN 
     (SELECT benefit_id 
      FROM employee_benefits 
      WHERE employee_id = 123 
     ) 
; 

보험 계획을 : : 위의 혜택을 제공

SELECT benefit_id 
    FROM benefit 
WHERE benefit_id NOT IN 
     (SELECT benefit_id 
      FROM employee_benefits 
      WHERE employee_id = 123 
     ) 
; 

보험 계획 : 직원 123 보유하지

장점

SELECT insurance_id 
    FROM insurance 
WHERE insurance_id NOT IN 
     (SELECT DISTINCT insurance_id 
      FROM insurance_benefits 
      WHERE benefit_id NOT IN 
        (SELECT benefit_id 
         FROM employee_benefits 
        WHERE employee_id = 123 
       ) 
     ) 
; 
+0

고맙습니다. 이것은 정말로 도움이됩니다. 하지만 그 지역에 대한 나의 지식 부족으로 인해 여전히 점들을 연결시키지 않을 수 있습니다. 주요 질문은 보험료가 정확히 같거나 직원이 보유하고있는 혜택의 일부를 구성하지만 그 이상을 제외한 모든 보험을 선택하는 방법입니다. 직원이 보유하지 않은 보험에 보험을 포함해서는 안됩니다. 말이 돼? –

+0

@KevinHandy : 생각이 들었습니다. * 제 대답에 대한 마지막 질문은 당신이 묘사하고 있다고 생각했던 것입니다. 내가 뭔가를 오해하고 있니? 예상 한 결과가 보이지 않습니까? – ruakh

+0

죄송하지만 어쩌면 내가 설명 할 수 없습니다. 나는 이미 직원이 보유하고있는 혜택의 일부 또는 전부를 보험 계획으로 찾고 있습니다. 예 : –