2013-10-30 1 views
0

다음 스키마가 있습니다.공통 루트에 다중 외부 결합이있는 데카르트 조인

Schema Picture

나는 두 개의 쿼리를 매우 간단하게 하나 나에게 channel mappings의 조합 널 (null)로, 예약 모델에 맞게 'revenue_stream_mappings'모두를 줄 것이다

select * from booking_model_assignment 
    join booking_model on booking_model_assignment.booking_model_id = booking_model.id 
left outer join axis_channel_mappings on bmi_id = axis_channel_mappings.assignment_id 
left outer join axis_revenue_stream_mappings on bmi_id = axis_revenue_stream_mappings.assignment_id 

이 경우 실행할 수있는 테이블 중 하나에서만 일치합니다.

다른 쿼리

select * from axis_channel join axis_revenue_stream 

채널 및 수익 창출의 가능한 모든 조합을 제공합니다.

내가 원하는 것은 모든 조합을 제공하는 쿼리이며 해당 조합이 일치하는 경우 booking_model입니다.

내가 가입하려고하거나 하위 쿼리를 시도 할 때마다 너무 많거나 너무 적은 결과를 얻는 것처럼 보입니다. 문제는 assign_id가 외부 조인을 통해 일치하도록하지만 외부 조인이있는 경우에만 수행하는 것입니다.

스키마가 이와 같이 배치되어 새로운 축을 추가하고 조합 모델을 조합 할 수 있으므로 더 쉬운 방법이 있으면 스키마를 변경할 수 있습니다.

편집 나는 Eggyal의 답변에 따라 부분적인 해결책을 가지고 있지만 그것은 확장되지 않습니다.

SELECT  c.*, r.*, GROUP_CONCAT(a.bmi_id), GROUP_CONCAT(b.name) AS booking_models 
FROM   axis_channel     c 
CROSS JOIN axis_revenue_stream   r 
LEFT JOIN axis_channel_mappings  cm ON cm.channel_id  = c.id 
LEFT JOIN axis_revenue_stream_mappings rm ON rm.revenue_stream_id = r.id 
LEFT JOIN booking_model_assignment  a ON (a.bmi_id = cm.assignment_id 
              AND a.bmi_id = rm.assignment_id) 
              OR (a.bmi_id = cm.assignment_id 
              AND rm.assignment_id IS NULL) 
              OR (cm.assignment_id IS NULL 
              AND a.bmi_id = cm.assignment_id) 
LEFT JOIN booking_model    b ON b.id = a.booking_model_id 
GROUP BY  c.id, r.id 

하지만이 쿼리는 성가신에 방법을 확장 할 축 이상을 추가한다면.

답변

1
SELECT  c.*, r.*, GROUP_CONCAT(b.name) AS booking_models 
FROM   axis_channel     c 
    CROSS JOIN axis_revenue_stream   r 
    LEFT JOIN axis_channel_mappings  cm ON cm.channel_id  = c.id 
    LEFT JOIN axis_revenue_stream_mappings rm ON rm.revenue_stream_id = r.id 
    LEFT JOIN booking_model_assignment  a ON a.bmi_id = cm.assignment_id 
              AND a.bmi_id = rm.assignment_id 
    LEFT JOIN booking_model    b ON b.id = a.booking_model_id 
GROUP BY  c.id, r.id 
+0

감사합니다. 몇 가지 흥미로운 도움말이 있습니다. 그러나 그것은 효과가 없습니다. axis_revenue_stream_mapping 및 axis_channel_mappings에 할당 세트가있는 경우 만 선택합니다. 나는 그것을 테이블이나 둘 다 필요로한다. 따라서 revenue_stream이 설정되었지만 채널이 아닌 경우 해당 수익 스트림이있는 모든 채널에 적용됩니다. –

+0

@JeremyFrench : 그러면 'AND'를 'OR'로 변경해야합니다. – eggyal

+0

그 중 하나를 선택하면 '예약 모델'b가 채널 a이고 'revenue_stream'X가 모든 조합을 선택합니다. 나는 귀하의 질문에 게시됩니다 기반으로 확장 할 수없는 솔루션이 있습니다. –