다음 스키마가 있습니다.공통 루트에 다중 외부 결합이있는 데카르트 조인
나는 두 개의 쿼리를 매우 간단하게 하나 나에게 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
하지만이 쿼리는 성가신에 방법을 확장 할 축 이상을 추가한다면.
감사합니다. 몇 가지 흥미로운 도움말이 있습니다. 그러나 그것은 효과가 없습니다. axis_revenue_stream_mapping 및 axis_channel_mappings에 할당 세트가있는 경우 만 선택합니다. 나는 그것을 테이블이나 둘 다 필요로한다. 따라서 revenue_stream이 설정되었지만 채널이 아닌 경우 해당 수익 스트림이있는 모든 채널에 적용됩니다. –
@JeremyFrench : 그러면 'AND'를 'OR'로 변경해야합니다. – eggyal
그 중 하나를 선택하면 '예약 모델'b가 채널 a이고 'revenue_stream'X가 모든 조합을 선택합니다. 나는 귀하의 질문에 게시됩니다 기반으로 확장 할 수없는 솔루션이 있습니다. –