위젯에 대한 내역 데이터를 수집하기 위해 WidgetHistory 테이블에 조인해야하는 위젯 테이블이 있습니다. 각 위젯에는 Doodad와 Thing 테이블에도 레코드가 있습니다. 위젯의 각 관련 버전을 반환하는 sproc로 작업하고 있습니다.두 개의 다른 테이블에서 SQL 왼쪽 결합
까다로운 부분은 WidgetHistory 테이블이 비교적 새롭고 최근에 수정되지 않은 오래된 위젯이 WidgetHistory 테이블에서 해당 레코드를 갖지 않는다는 것입니다. 위젯의 각 관련 버전을 검색 할 때 WidgetHistory, Doodad 및 Thing 테이블간에 왼쪽 조인을 수행합니다. WidgetHistory 레코드가없는 위젯의 경우 대신 위젯, Doodad 및 Thing 테이블에 참여하기를 원합니다.
매우 제한된 사용 사례에 대해이 기능이 작동하지만 WidgetHistory 레코드가있는 위젯에 대해 예기치 않은 결과가 발생할 것으로 생각됩니다.
SELECT
w.ID,
ISNULL(h.Title, w.Title)
d.Version,
t.Size
FROM dbo.Widget as w
LEFT JOIN dbo.WidgetHistory as h ON w.ID = h.ID
LEFT JOIN dbo.Doodad as d ON h.DoodadID = d.ID /*!*/ OR w.DoodadID = d.ID
LEFT JOIN dbo.Thing as t ON h.ThingID = t.ID /*!*/ OR w.ThingID = t.ID
나에 대한 의심 나는 부분은 이후 무엇 :
은 여기 (간체) 쿼리입니다! 마지막 두 조인은 대신 위젯, 두두 드, 그리고 사물 사이에 별도의 왼쪽 조인 시리즈를 할 수 있다는 것을 압니다.하지만 과도하게 보입니다 (하지만 그렇지 않을 수도 있습니다).
더 나은 전략에 대한 의견이 있으십니까? WidgetHistory, Doodad, Thing 사이에 왼쪽 조인을하고 싶습니다. 위젯에 대한 WidgetHistory 레코드가 없으면 위젯, Doodad 및 Thing 간의 조인을 수행해야합니다.
감사합니다.
왜? 하나의 열만 필요하기 때문에 왼쪽 조인 대신 하위 쿼리를 수행하면됩니다. – SQLMason
'ON d.ID = isnull (h.DadadID, w.DoodadID)'와 같은 조인을 사용하면 나에게 분명하게 보입니다. – Arvo