Sql 用于在两个条目之间获得匹配的自完全外部联接的替代方法
在我的db模型中,我有两个实体:权利和权利数据。每个权利由递增的ID(标识)标识,并且可以有多个权利_数据条目,每个条目具有不同的类型-可以是0(每周)或1(每月)(权利ID和类型是权利_数据的主键,权利ID是权利表的FK)。 对于每项权利,我需要: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等
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