2011-09-21 7 views
2

제목이 잘못되었습니다. 사과드립니다. SQL Server - 조건부 조인이 null이 아닌 테이블에

나는 두 개의 다른 테이블

MasterTable 서브 SubTableArchive


그래서, MasterTable는 ID 필드를 포함 중 하나에 테이블을 가입하려합니다. SubTable 및 SubTableArchive에는 조인에 대한 MasterTableId 필드가 있습니다.

그러나 데이터는 이러한 SubTables 중 하나에만 존재합니다. 그래서 나는 테이블에 데이터가있는 테이블에 가입하고 싶습니다.

하지만 내가 알고있는 유일한 방법은 선택하는 모든 필드에 isnull을 사용하여 선택하는 것입니다. 그리고 빠르게 읽고 (쓰기도) 복잡해집니다. 필드 중 일부는 이미 포장되어 특히 때문에 ISNULL의

SELECT M.Id, ISNULL(S.Field1, SA.field1), ISNULL(S.field2, SA.Field2), 
SUM(CASE WHEN (ISNULL(S.Finished,SA.Finished)=1 AND ISNULL(ISNULL(S.ItemCode,SA.ItemCode),'')='') THEN 1 WHEN (ISNULL(S.Finished,SA.Finished)=0 AND ISNULL(ISNULL(S.AltItemCode,SA.AltItemCode),'')='') THEN 1 ELSE 0 END) AS SummaryField 
FROM MAsterTable M 
LEFT OUTER JOIN SubTable S ON S.MasterTableId = M.Id 
LEFT OUTER JOIN SubTableArchive SA ON S.MasterTableId = M.Id 
GROUP BY M.Id, ISNULL(S.Field1, SA.field1), ISNULL(S.field2, SA.Field2) 

그래서 작업,하지만 꽤되지 않습니다. 샘플은 있지만 실제 쿼리는 길고 복잡합니다.

SQL에 일종의 조건부 조인 기능이 내장되어 있었으면 좋겠다. 내가하려는 일을하고 쿼리를 조금 더 우호적 인 상태로두기를 바란다.

답변

4

또 다른 옵션은 INNER가 위의 조합에게보기를 할 경우는 적용 할 수있는,보기의 유지 보수 관점에서

SELECT M.x, S.x 
FROM MAsterTable M INNER JOIN SubTable S ON S.MasterTableId = M.Id 
UNION 
SELECT M.x, STA.x 
FROM MAsterTable M INNER JOIN SubTableArchive STA ON STA.MasterTableId = M.Id 

를 조인 사용 후 UNION을 사용하는 경우 뷰에 필터와 종류 문제를 단순화해야합니다.

1

아니요, 불행히도 없습니다.

1

하위 선택하거나 문을 사용하여 더 나은 (코드 테스트하지)이

SELECT M.Id, S.Field1,S.field2, 
    SUM(CASE WHEN S.Finished=1 AND ISNULL(S.ItemCode,'')='') 
     THEN 1 
     WHEN S.Finished=0 AND ISNULL(S.AltItemCode,'')='') 
     THEN 1 ELSE 0 END) AS SummaryField 
    FROM MAsterTable M 
    JOIN (
     SELECT id,field1,field2,ItemCode,AltItemCode,finished 
     FROM subTable 
     UNION 
     SELECT id,field1,field2,ItemCode,AltItemCode,finished 
     FROM subTableArchive 
    ) S ON S.id = M.Id 

    GROUP BY M.Id, S.Field1,S.field2 
2

사용을 시도해보십시오

WITH SubTable_WithArchive 
AS (SELECT Field1, Field2, Finished, ItemCode, AltItemCode, MasterTableID 
    FROM SubTable 
    UNION ALL 
    SELECT Field1, Field2, Finished, ItemCode, AltItemCode, MasterTableID 
    FROM SubTableArchive 
) 
SELECT M.Id, 
     S.Field1, 
     S.Field2, 
     SUM(CASE 
       WHEN s.Finished = 1 AND ISNULL(s.ItemCode, '') == '' THEN 1 
       WHEN s.Finished = 0 AND ISNULL(s.AltItemCode, '') == '' THEN 1 
       ELSE 0 
      END) 
      AS SummaryField 

FROM   MasterTable M 
LEFT OUTER JOIN SubTable_WithArchive S 
      ON S.MasterTableId = M.Id 
GROUP BY  M.Id, S.Field1, s.field2 
0

MasterTable에서 ID 값은 하나의 테이블 (SubTable 또는 SubTableArchive에 존재하는 것이기 때문에)이 쿼리를 사용할 수 있습니다 :

SELECT MasterTableId Id, Field1, Field2, 
SUM(CASE 
WHEN Finished=1 AND ItemCode IS NULL THEN 1 --OR ISNULL(ItemCode,'') = '' 
WHEN Finished=0 AND AltItemCode IS NULL THEN 1 --OR ISNULL(AltItemCode,'') = '' 
ELSE 0 
END) AS SummaryField 
FROM SubTable 
GROUP BY 1, 2, 3 

UNION ALL 

SELECT MasterTableId Id, Field1, Field2, 
SUM(CASE 
WHEN Finished=1 AND ItemCode IS NULL THEN 1 --OR ISNULL(ItemCode,'') = '' 
WHEN Finished=0 AND AltItemCode IS NULL THEN 1 --OR ISNULL(AltItemCode,'') = '' 
ELSE 0 
END) AS SummaryField 
FROM SubTableArchive 
GROUP BY 1, 2, 3 
관련 문제