Альтернативы самостоятельному внешнему соединению, чтобы получить матч между двумя записями

StackOverflow https://stackoverflow.com/questions/9308898

Вопрос

В моей модели БД у меня есть две организации: право и право. Каждое право идентифицируется с помощью идентификатора увеличения (идентификация) и может иметь несколько записей ensitultement_data, каждая из которых с другим типом - если может быть либо 0 (еженедельно), либо 1 (ежемесячно) (INTITLENTID и тип - PK для Ontultion_Data, ARITELMELTID - это FK. в таблицу прав). Для каждого права мне нужно:

  1. Получите первое не нулевое значение от ежемесячного (type = 1) или еженедельного (type = 0) ronitlement_data, для данного набора атрибутов ronitlement_data (shareSpaid, localtaxrate и т. Д.) - первая часть Select;
  2. Получите некоторые указания о совпадении/несоответствия между ежемесячными и еженедельными записями Antirtent_Data (shareSpaid_match и т. Д.) - последняя часть выбора.

Это запрос, который я использую банкомат:

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

Есть ли способ избежать полного внешнего соединения и получить необходимую мне информацию? Я оценил использование группы, но, похоже, не получаю необходимых результатов. Спасибо.

Это было полезно?

Решение

Почему бы вам не left join к «основной таблице», который 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

Вы можете ограничить ряды в Entitlement в последнее время в одном ряду Entitlement_Data Таблица (не заботясь о том, слабо или ежемесячно), используя:

where wd.type is not null or md.type is not null
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top