2016-12-14 3 views
1

조인과 널에 대해 많은 의문점이 있지만이 특정 스키마와 일치하는 항목을 찾을 수 없습니다. 3 개의 예쁜 테이블이 있습니다.NULL로 결합하기

+---------+ 
| service | 
+---------+ 
| id  | 
| name | 
+---------+ 

+-----------+ 
| propnames | 
+-----------+ 
| id  | 
| name  | 
| sort  | 
+-----------+ 

+----------+ 
| props | 
+----------+ 
| sid  | 
| pid  | 
| value | 
+----------+ 
내가 (propnames에) 속성을 추가하고 내 서비스를 조회, 내 성질 (소품)에 가입하고 속성이 아직 설정되지 않은 알 수 있도록하고 싶습니다

.

(service.id), (service.name), (property.id), (property.name), (props.value) 
1, "AAA", 1, "property_a", "Service AAA has property_a value" 
1, "AAA", 2, "property_b", "Service AAA has property_b value" 
1, "AAA", 3, "property_c", NULL 
2, "BBB", 1, "property_a", "Service BBB has property_a value" 
2, "BBB", 2, "property_b", NULL 
2, "BBB", 3, "property_c", NULL 
:

이 경우 서비스

(id), (name) 
1, "AAA" 
2, "BBB" 

이이

(service.id), (propname.id), (value) 
1, 1, "Service AAA has property_a value" 
1, 2, "Service AAA has property_b value" 
2, 1, "Service BBB has property_a value" 

그리고 궁극적으로 나의 질의는를 생성합니다 소품

입니다 propnames

(id), (name), (sort) 
1, "property_a", 1 
2, "property_b", 2 
3, "property_c", 3 

입니다

이상적으로는 service.name의 ASC -then- property.sort

으로 분류 될 현재 불완전한 쿼리는 다음과 같습니다

SELECT s.id, s.name, p.id, p.name, props.value 
FROM service.s 
LEFT JOIN propnames p ON s.id = p.sid 
LEFT JOIN props ON props.pid = p.id 
ORDER BY s.name ASC, p.sort ASC 

답변

1

이 행을 생성하는 cross join를 사용합니다. 그런 다음 left join을 사용하여 일치 항목을 찾으십시오.

select s.id, s.name, p.id, p.name, props.value 
from services s cross join 
    propnames p left join 
    props 
    on props.sid = s.id and props.pid = p.id;