Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于在两个条目之间获得匹配的自完全外部联接的替代方法_Sql_Sql Server_Outer Join_Self Join - Fatal编程技术网

Sql 用于在两个条目之间获得匹配的自完全外部联接的替代方法

Sql 用于在两个条目之间获得匹配的自完全外部联接的替代方法,sql,sql-server,outer-join,self-join,Sql,Sql Server,Outer Join,Self Join,在我的db模型中,我有两个实体:权利和权利数据。每个权利由递增的ID(标识)标识,并且可以有多个权利_数据条目,每个条目具有不同的类型-可以是0(每周)或1(每月)(权利ID和类型是权利_数据的主键,权利ID是权利表的FK)。 对于每项权利,我需要: 从每月(类型=1)或每周(类型=0)的权利_数据中获取给定权利_数据属性集(SharesPaid、LocalTaxRate等)的第一个非空值-选择的第一部分 获取关于每月和每周权利数据项之间匹配/不匹配的指示(SharesPaid\u match等

在我的db模型中,我有两个实体:权利和权利数据。每个权利由递增的ID(标识)标识,并且可以有多个权利_数据条目,每个条目具有不同的类型-可以是0(每周)或1(每月)(权利ID和类型是权利_数据的主键,权利ID是权利表的FK)。 对于每项权利,我需要:

  • 从每月(类型=1)或每周(类型=0)的权利_数据中获取给定权利_数据属性集(SharesPaid、LocalTaxRate等)的第一个非空值-选择的第一部分
  • 获取关于每月和每周权利数据项之间匹配/不匹配的指示(SharesPaid\u match等)——选择的最后一部分
  • 这是我使用atm的查询:

    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
    
    选择
    合并(MD.AuthenticationId,WD.AuthenticationId)作为AuthenticationId,
    合并(MD.LocalTaxRate,WD.LocalTaxRate)为LocalTaxRate,
    合并(MD.SharesPaid,WD.SharesPaid)为SharesPaid,
    合并(MD.LocalTaxAmount,WD.LocalTaxAmount)为LocalTaxAmount,
    合并(MD.LocalTaxeEquivalent,WD.LocalTaxeEquivalent)为LocalTaxeEquivalent,
    合并(MD.NetReceived,WD.NetReceived)为NetReceived,
    合并(MD.LocalTaxCurrency,WD.LocalTaxCurrency)为LocalTaxCurrency,
    合并(MD.Currency,WD.Currency)作为货币,
    合并(MD.ReleaseDate,WD.ReleaseDate)作为ReleaseDate,
    (
    案例
    当MD.LocalTaxEquivalent为NULL或WD.LocalTaxEquivalent为NULL时,则为NULL
    当MD.LocalTaxEquivalent WD.LocalTaxEquivalent时,则为0
    其他1
    结束
    )作为等价匹配,
    (
    案例
    当MD.NetReceived为NULL或WD.NetReceived为NULL时,则为NULL
    当MD.NetReceived WD.NetReceived时,则为0
    其他1
    结束
    )作为一场比赛,
    (
    案例
    当MD.SharesPaid为NULL或WD.SharesPaid为NULL时,则为NULL
    当MD.SharesPaid WD.SharesPaid时,则为0
    其他1
    结束
    )作为一场比赛,
    (
    案例
    当MD.Currency为NULL或WD.Currency为NULL时,则为NULL
    当MD.Currency WD.Currency时,则为0
    其他1
    结束
    )随着货币的匹配,
    (
    案例
    当MD.DividendRate为NULL或WD.DividendRate为NULL时,则为NULL
    当MD.DividendRate WD.DividendRate时,则为0
    其他1
    结束
    )作为DividendRate_匹配,
    (
    案例
    当MD.LocalTaxRate为NULL或WD.LocalTaxRate为NULL时,则为NULL
    当MD.LocalTaxRate WD.LocalTaxRate时,则为0
    其他1
    结束
    )作为本地税率匹配
    从…起
    数据管理
    完全外部联接授权\u数据WD
    在MD.AuthenticationId=WD.AuthenticationId上
    哪里
    WD.Type=0和MD.Type=1
    
    有没有办法避免完全的外部连接并获得我需要的信息?我评估了一个小组的使用情况,但我似乎没有得到我需要的结果。
    谢谢。

    您为什么不
    左键加入到“主表”中,它是
    权利
    类似于以下代码:

    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
    

    对于单个授权id,是否有多个月值和多个周值?或者,每个最多只能有一个?如果您有多条记录,您希望只选择一条记录的规则是什么?有最早日期的记录吗?或者别的什么?不,我对每个(授权id,类型)都有一个条目-我对(授权id,类型)@DEM有PK约束“…授权id和类型是PK…”,所以授权id只有一个月值。
    where wd.type is not null or md.type is not null