关于多种可能性的SQL JOIN

时间:2017-01-16 22:28:57

标签: sql-server join

我有一个奇怪的查询我必须做。我有两个具有多对多关系的表,因此桥表位于中间。桥表现在由以下人员填充:

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_NumberParcelID。一张桌子上有超过1.8亿条记录,另一张桌面有超过2000万条记录。我的问题是这两者可以匹配的方式不止一种:

  1. Assessors_Parcel_Identification_Number = ParcelID
  2. replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', '') = ParcelID
  3. replace(replace(replace(M.Assessors_Parcel_Identification_Number, ' ', ''), '.', ''), '_', '') = ParcelID
  4. 将来可能会有更多。

    问题是如果我执行join on OR情况,那就是笛卡尔的答案。我需要在任何一个条件下进行一对一的加入。如何对其进行重组以便进行一次扫描,如果在任何条件下加入了加入?

    感谢。

1 个答案:

答案 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)。

无论如何,这些都不是理想的解决方案,不能很好地扩展到这么大的表。理想的解决方案是清理数据以提供您可以使用的单个列标识符。