如何查找内容表 SQL 中的差异
Posted
技术标签:
【中文标题】如何查找内容表 SQL 中的差异【英文标题】:How to find differences in a content table SQL 【发布时间】:2018-12-14 09:30:13 【问题描述】:我想根据同一张表中的不同数据集查找彼此不同的记录,这些数据集在不同的日期加载。 因此,如果一个或多个属性(除了键)与 2018 年 1 月 1 日加载的数据集 x 和 2018 年 12 月 31 日加载的数据集 y 不同。 我如何在 SQL 中实现这一点?
应该进行比较的键是 ZIP_CODE + House_ID
你好,
【问题讨论】:
我们在谈论哪些 dbms? 请提供样本数据和期望的结果。 【参考方案1】:您可以通过 LAG 获取以前的邮政编码
SELECT ZipCode, HouseId,
LAG(ZipCode, 1,0) OVER (ORDER BY LoadDate) AS ZipCodeMinus1,
LAG(HouseId, 1,0) OVER (ORDER BY LoadDate) AS HouseIdMinus11
FROM Addresses;
【讨论】:
谢谢!但是,如果 x 列在 2018 年 1 月 1 日的值为 10,而在 2018 年 12 月 31 日的值为 15,该怎么办?如何根据 ZIP_CODE + House_ID 找到该记录? 编辑了我的答案。您可以通过 SQL 上的子查询来进行计算【参考方案2】:比较集合的简单方法是
select ... a
EXCEPT
select ... b
但你需要另一个
select ... b
EXCEPT
select ... a
这并不能告诉您哪些列不同。
或者你使用full outer join
:
select
coalesce(a.ZIP_CODE, b.ZIP_CODE)
,coalesce(a.House_ID, b.House_ID)
,case when a.col1 <> b.col then 'a: || a.col1 || ' b:' || b.col1 end
...
from
( select ....) as a
full join
( select ....) as b
on a.ZIP_CODE = b.ZIP_CODE
and a.House_ID = b.House_ID
and ( a.col1 <> a.col1 or
a.col2 <> a.col2 or
a.col3 <> a.col3 or
...
)
如果列可以为 NULL,则需要添加更多条件检查 两列之一是否为 NULL。当然,这种比较语法可以使用现有的元数据自动创建....
【讨论】:
以上是关于如何查找内容表 SQL 中的差异的主要内容,如果未能解决你的问题,请参考以下文章