2012-02-16 2 views
4

두 항목 : Entitlement 및 Entitlement_Data가 있습니다. 각 Entitlement는 증가하는 ID (IDENTITY)로 식별되며 유형이 각각 다른 여러 Entitlement_Data 항목을 가질 수 있습니다. 0 (주별) 또는 1 (월별) (EntitlementID 및 Type은 Entitlement_Data의 PK, EntitlementID는 FK to Entitlement 테이블). 각 자격에 대한 , 내가 필요로 :두 개의 항목 사이에 일치 항목을 얻기 위해 자체 OUTER JOIN에 대한 대안 내 db 모델에있는

  1. 첫 번째 NULL이 아닌 값을 가져에서 중 월 (유형 = 1) 또는 주간 (유형 = 0) Entitlement_Data, Entitlement_Data의 주어진 속성에 대해 (SharesPaid, LocalTaxRate , etc ...) - SELECT의 첫 번째 부분.
  2. 월간 및 주간 Entitlement_Data 항목 (SharesPaid_Match, etc ...) 사이의 일치/불일치에 대한 표시 - SELECT의 마지막 부분.

이 내가 쿼리를 사용하고있다 기압 :

SELECT 
    COALESCE(MD.EntitlementID, WD.EntitlementID) AS EntitlementID, 
    COALESCE(MD.LocalTaxRate, WD.LocalTaxRate) AS LocalTaxRate, 
    COALESCE(MD.SharesPaid, WD.SharesPaid) AS SharesPaid, 
    COALESCE(MD.LocalTaxAmount, WD.LocalTaxAmount) AS LocalTaxAmount, 
    COALESCE(MD.LocalTaxEquivalent, WD.LocalTaxEquivalent) AS LocalTaxEquivalent, 
    COALESCE(MD.NetReceived, WD.NetReceived) AS NetReceived, 
    COALESCE(MD.LocalTaxCurrency, WD.LocalTaxCurrency) AS LocalTaxCurrency, 
    COALESCE(MD.Currency, WD.Currency) AS Currency, 
    COALESCE(MD.ReleaseDate, WD.ReleaseDate) AS ReleaseDate, 
    (
     CASE 
      WHEN MD.LocalTaxEquivalent IS NULL OR WD.LocalTaxEquivalent IS NULL THEN NULL 
      WHEN MD.LocalTaxEquivalent <> WD.LocalTaxEquivalent THEN 0 
      ELSE 1 
     END 
    ) AS LocalTaxEquivalent_Match, 
    (
     CASE 
      WHEN MD.NetReceived IS NULL OR WD.NetReceived IS NULL THEN NULL 
      WHEN MD.NetReceived <> WD.NetReceived THEN 0 
      ELSE 1 
     END 
    ) AS NetReceived_Match, 
    (
     CASE 
      WHEN MD.SharesPaid IS NULL OR WD.SharesPaid IS NULL THEN NULL 
      WHEN MD.SharesPaid <> WD.SharesPaid THEN 0 
      ELSE 1 
     END 
    ) AS SharesPaid_Match, 
    (
     CASE 
      WHEN MD.Currency IS NULL OR WD.Currency IS NULL THEN NULL 
      WHEN MD.Currency <> WD.Currency THEN 0 
      ELSE 1 
     END 
    ) AS Currency_Match, 
    (
     CASE 
      WHEN MD.DividendRate IS NULL OR WD.DividendRate IS NULL THEN NULL 
      WHEN MD.DividendRate <> WD.DividendRate THEN 0 
      ELSE 1 
     END 
    ) AS DividendRate_Match, 
    (
     CASE 
      WHEN MD.LocalTaxRate IS NULL OR WD.LocalTaxRate IS NULL THEN NULL 
      WHEN MD.LocalTaxRate <> WD.LocalTaxRate THEN 0 
      ELSE 1 
     END 
    ) AS LocalTaxRate_Match 
FROM 
    Entitlement_Data MD 
    FULL OUTER JOIN Entitlement_Data WD 
     ON MD.EntitlementID = WD.EntitlementID 
WHERE 
    WD.Type = 0 AND MD.Type = 1 

FULL OUTER을 피하기 가입하고 내가 필요한 정보를 얻을 수있는 방법이 있나요? 나는 GROUP BY의 사용법을 평가했지만 필요한 결과를 얻지 못하는 것 같습니다. 감사합니다.

+0

단일 자격 부여 ID의 경우 여러 개의 월간 값과 여러 주 값이 있습니까? 아니면, 단지 각각 1 개입니까? 배수가있는 경우 하나의 레코드 만 선택하려는 규칙은 무엇입니까? 가장 빠른 데이트 기록? 또는 다른 것? – MatBailie

+0

아니요, 각각 (EntitlementID, Type)에 대해 하나의 항목이 있습니다. (EntitlementID, Type)에 대한 PK 제약 조건이 있습니다. –

+0

@Dems "... EntitlementID 및 Type은 PK ..."이므로 권한 부여를위한 월간 값은 하나뿐입니다 신분증. –

답변

4

왜 그렇죠 left join 다음 코드처럼 Entitlement이다 "기본 테이블"로 : 당신은 있는지 걱정없이 Entitlement_Data 테이블의 마지막 행에서이 Entitlement (에 행을 제한 할 수

select 
    COALESCE(MD.EntitlementID, WD.EntitlementID) AS EntitlementID, 
    COALESCE(MD.LocalTaxRate, WD.LocalTaxRate) AS LocalTaxRate, 
    COALESCE(MD.SharesPaid, WD.SharesPaid) AS SharesPaid, 
    COALESCE(MD.LocalTaxAmount, WD.LocalTaxAmount) AS LocalTaxAmount, 
    COALESCE(MD.LocalTaxEquivalent, WD.LocalTaxEquivalent) AS LocalTaxEquivalent, 
    COALESCE(MD.NetReceived, WD.NetReceived) AS NetReceived, 
    COALESCE(MD.LocalTaxCurrency, WD.LocalTaxCurrency) AS LocalTaxCurrency, 
    COALESCE(MD.Currency, WD.Currency) AS Currency, 
    COALESCE(MD.ReleaseDate, WD.ReleaseDate) AS ReleaseDate, 
    (
     CASE 
      WHEN MD.LocalTaxEquivalent IS NULL OR WD.LocalTaxEquivalent IS NULL THEN NULL 
      WHEN MD.LocalTaxEquivalent <> WD.LocalTaxEquivalent THEN 0 
      ELSE 1 
     END 
    ) AS LocalTaxEquivalent_Match, 
    (
     CASE 
      WHEN MD.NetReceived IS NULL OR WD.NetReceived IS NULL THEN NULL 
      WHEN MD.NetReceived <> WD.NetReceived THEN 0 
      ELSE 1 
     END 
    ) AS NetReceived_Match, 
    (
     CASE 
      WHEN MD.SharesPaid IS NULL OR WD.SharesPaid IS NULL THEN NULL 
      WHEN MD.SharesPaid <> WD.SharesPaid THEN 0 
      ELSE 1 
     END 
    ) AS SharesPaid_Match, 
    (
     CASE 
      WHEN MD.Currency IS NULL OR WD.Currency IS NULL THEN NULL 
      WHEN MD.Currency <> WD.Currency THEN 0 
      ELSE 1 
     END 
    ) AS Currency_Match, 
    (
     CASE 
      WHEN MD.DividendRate IS NULL OR WD.DividendRate IS NULL THEN NULL 
      WHEN MD.DividendRate <> WD.DividendRate THEN 0 
      ELSE 1 
     END 
    ) AS DividendRate_Match, 
    (
     CASE 
      WHEN MD.LocalTaxRate IS NULL OR WD.LocalTaxRate IS NULL THEN NULL 
      WHEN MD.LocalTaxRate <> WD.LocalTaxRate THEN 0 
      ELSE 1 
     END 
    ) AS LocalTaxRate_Match 
from Entitlement e 
left join Entitlement_Data wd on e.id = wd.entitlementID and wd.type = 0 
left join Entitlement_Data md on e.id = md.entitlementID and md.type = 1 

약한 또는 매월) :

where wd.type is not null or md.type is not null