2012-10-15 1 views
2

개체가있을 수도 있고 가지지 않을 수도있는 다양한 특성을 포함하는 특성 테이블이 있습니다.빈 하위 집합을 포함 할 수있는 여러 외부 조인

개체와 함께 모든 특성을 가져 오려고합니다. 특성이없는 경우 null입니다. 쿼리에서

내 첫 번째 시도는이이었다

SELECT o.Id , 
aa.Value AS AttributeA, 
ab.Value AS AttributeB, 
ac.Value AS AttributeC 
FROM Objects o 
LEFT OUTER JOIN Attributes aa 
ON (o.Id = aa.ObjectId) 
LEFT OUTER JOIN Attributes ab 
ON (o.Id = ab.ObjectId) 
LEFT OUTER JOIN Attributes ac  
ON (o.Id = ac.ObjectId) 
WHERE (aa.AttributeTypeId = 1 OR aa.AttributeTypeId IS NULL) 
AND (ab.AttributeTypeId = 2 OR ab.AttributeTypeId IS NULL) 
AND (ac.AttributeTypeId = 3 OR ac.AttributeTypeId IS NULL) 
AND o.Id = @objectId 

이 문제는 어떤 객체가 아직없는 경우, 말을 너무 만 전혀 속성을 가진 개체를 다음 AA의 일부가 비어하는 속성이다 반환됩니다.

많은 수의 UNION으로 들어 가지 않고 속성 시나리오가 혼합 된 경우에도 SQL Server가 모든 개체를 반환하도록하려면 어떻게해야합니까? (특성 유형의 수가 20 개 이상인 경우)?

답변

2

외부 조인의 대상을 필터링 할 때 필터를 조인에 넣어야합니다.

예 :

FROM Objects o 
LEFT OUTER JOIN Attributes aa 
ON (o.Id = aa.ObjectId) and (aa.AttributeTypeId = 1) 
1

필자는 피벗을 사용했습니다. 애트리뷰트 레코드가 전혀 없다면 여전히 실패하지만 하나의 애트리뷰트를 가진 더미 오브젝트를 사용하면 쉽게 해결할 수있다.

SELECT pvt.ObjectId, 
pvt.[1] AS [AttributeA], 
pvt.[2] AS [AttributeB], 
pvt.[3] AS [AttributeC] 
FROM 
(
    SELECT o.ObjectId, att.Value, att.AttributeTypeId 
    FROM Objects o 
    LEFT OUTER JOIN Attributes att ON o.Id = att.ObjectId 
    WHERE o.Id = @objectId 
) attributes 
PIVOT(MAX(Value) FOR AttributeTypeId 
IN ([1], [2], [3])) pvt