我有一个奇怪的查询我必须做。我有两个具有多对多关系的表,因此桥表位于中间。桥表现在由以下人员填充:
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
情况,那就是笛卡尔的答案。我需要在任何一个条件下进行一对一的加入。如何对其进行重组以便进行一次扫描,如果在任何条件下加入了加入?
感谢。
答案 0 :(得分:0)
我认为的两种方式是:
首先,您需要确定尝试加入的顺序。然后,您需要确定使用联接的逻辑。最后,将该逻辑应用于连接上的case语句中。
我假设所提供的连接都不能在100%的时间内使用,并且在结果连接中应该是相同的。
JOIN PROPERTY_PARAMETERS P ON
ParcelID = CASE
WHEN Assessors_Parcel_Identification_Number IS NOT NULL THEN Assessors_Parcel_Identification_Number
WHEN TRY_CAST(replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', '') AS INT) IS NOT NULL THEN TRY_CAST(replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', '') AS INT) = ParcelID
WHEN TRY_CAST(replace(replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', ''), '_', '') AS INT) IS NOT NULL THEN TRY_CAST(replace(replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', ''), '_', '') AS INT) = ParcelID
END
另一种选择是加入表格3次,每次加入一次。然后你可以isnull(isnull(resulta,resultb),resultc)。
无论如何,这些都不是理想的解决方案,不能很好地扩展到这么大的表。理想的解决方案是清理数据以提供您可以使用的单个列标识符。