2013-03-21 3 views
1

위젯에 대한 내역 데이터를 수집하기 위해 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 간의 조인을 수행해야합니다.

감사합니다.

+0

왜? 하나의 열만 필요하기 때문에 왼쪽 조인 대신 하위 쿼리를 수행하면됩니다. – SQLMason

+0

'ON d.ID = isnull (h.DadadID, w.DoodadID)'와 같은 조인을 사용하면 나에게 분명하게 보입니다. – Arvo

답변

1

MySQL을 사용해 보았는데 해결책이 있다고 생각합니다.

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 d.ID = ISNULL(h.DoodadID, w.DoodadID) 
LEFT JOIN dbo.Thing as t ON t.ID = ISNULL(h.ThingID, w.ThingID) 

내가 대신 ISNULL의, MySQL을 함수 IFNULL를 사용했다,하지만 모두 같은 방식으로 작동하는 것 같다 : 그것뿐만 아니라 SQL 서버에서 작동 바랍니다.

내 MySQL을 테스트 :

위젯 :

 
------ ----------- ------- 
| id | doodad_id | value | 
------ ----------- ------- 
| 1 |   1 |  1 | 
| 2 |   5 |  5 | 
| 3 |   3 |  3 | 
| 4 |   6 |  6 | 
------ ----------- ------- 

WidgetHistory

 
------ ----------- ------- 
| id | doodad_id | value | 
------ ----------- ------- 
| 2 |   2 |  2 | 
| 4 |   4 |  4 | 
------ ----------- ------- 

장식물 :

 
------ --------- 
| id | version | 
------ --------- 
| 1 |  1 | 
| 2 |  2 | 
| 3 |  3 | 
| 4 |  4 | 
| 5 |  5 | 
| 6 |  6 | 
------ --------- 

그리고 쿼리 결과 :

 
------ ------------------------------------------- --------- 
| id | IFNULL(widgetHistory.value, widget.value) | version | 
------ ------------------------------------------- --------- 
| 1 |           1 |  1 | 
| 2 |           2 |  2 | 
| 3 |           3 |  3 | 
| 4 |           4 |  4 | 
------ ------------------------------------------- --------- 

테이블 Doodad에서 작동하므로 테이블뿐만 아니라 작동해야합니다.

나는 그것이 당신을 위해 일하기를 희망합니다!

+0

Perfect, Join 조건에 대한 ISNULL에 대해 왜 생각하지 않았습니까? –

0

나 자신이 조합 쿼리를 사용하고 싶습니다. 상위 절반은 WidgetHistory에 참여하고 나머지 절반은 WidgetHistory에 참여하지 않습니다.

관련 문제