【发布时间】:2017-01-16 22:28:56
【问题描述】:
我有一个奇怪的问题要问。我有两个具有多对多关系的表,所以中间有一个桥接表。桥接表现在由以下人员填充:
select
P.RTPropertyUniqueIdentifier
, P.ParcelID
, M.Assessors_Parcel_Identification_Number
, M.FA_Unique_Listing_Identifier_Ref_ID
, M.Property_Type
, M.Property_Address
, P.AddUnitNum
, 0 as multiple_flag
into PP_MLS_BRIDGE
FROM MLS M
join PROPERTY_PARAMETERS P on
replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', '') = P.ParcelID;
这是我的问题。
连接字段为Assessors_Parcel_Identification_Number 和ParcelID。一张表中有超过 1.8 亿条记录,另一张表中有 2000 万条记录。我的问题是这两者可以匹配的方式不止一种:
-
Assessors_Parcel_Identification_Number=ParcelID -
replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', '')=ParcelID -
replace(replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', ''), '_', '')=ParcelID
未来可能还会有更多。
问题是如果我执行join on OR 情况,它的笛卡尔答案。我需要在任何一个条件下进行一对一的加入。如何重组它以便扫描一次,如果在任何条件下存在连接,它就是连接?
谢谢。 .
【问题讨论】:
-
您在寻找与技术无关的解决方案吗?我已经使用 SQL Server 使用 ROW_NUMBER 解决了类似的问题;按主键对结果进行分区,然后按行号选择第一个结果。不过,对于 2000 万个结果,您可能需要一种不同的方法。
-
不清楚 - 表是否可以有效地加入,比如这些表示中的 2 个?或者这是一个数据清理练习?我建议您添加一个列(计算或批量加载)来计算正确的连接值,然后只连接该列(另一个优点是您可以索引它)
-
我认为这样的情况是不可维护的。我会在
MLS表中添加一个名为ParcelId的列,尽我所能将所有现有的Assessors_Parcel_Identification_Number转换为有效的ParcelID,并在插入时检查匹配。 -
我可以看到列的东西,但我仍然会遇到匹配字段的问题。它可能是基于 3 种可能方法中的一种的匹配,这一事实仍然存在。
-
@Nick.McDermaid 我试图通过尽可能多的匹配将这两个表连接在一起。比赛结果进入桥牌表。我在这里遇到的问题是三个可能关联的连接条件。
标签: sql-server join