2017-01-16 3 views
1

У меня есть странный запрос, который я должен сделать. У меня две таблицы, которые имеют множественное отношение, поэтому таблица моста находится посередине. Стол моста заселен прямо сейчас:SQL 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_Number и ParcelID. В одной таблице более 180 миллионов записей и 20 миллионов записей в другой. Моя проблема заключается в том, что есть более чем один способ эти два могут быть отмечены:

  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

и там может быть больше в будущем.

Проблема в том, что я выполняю ситуацию join on OR, это декартово ответы. Мне нужно одно-единственное соединение в любом ОДНОМ из условий. Как я реструктурирую это, чтобы он сканировал один раз, и если есть соединение в любом из условий, это соединение?

Спасибо. .

+0

Вы ищете технологическое агностическое решение? Я решил что-то подобное, используя ROW_NUMBER, используя SQL Server; Разделите свои результаты с помощью Первичного ключа, затем выберите первый результат по RowNumber. Тем не менее, для 20 миллионов результатов вам может понадобиться другой подход. – KyleUp

+0

Непонятно - может ли таблица быть присоединена, скажем, 2 из этих представлений? Или это упражнение по очистке данных? Я предлагаю вам добавить столбец (либо вычисленный, либо загруженный в пакетном режиме), который выдает правильное значение соединения, а затем просто присоединяется к этому столбцу (другое преимущество состоит в том, что вы можете его индексировать) –

+0

Я думаю, что такая ситуация не поддерживается. Я бы добавил столбец 'ParcelId' в таблицу' MLS', сделайте все возможное, чтобы преобразовать все существующие 'Оценки_Parcel_Identification_Number' в действительный ParcelID и в будущем проверить соответствие во время вставки. – xzoert

ответ

0

2 способа я вижу, чтобы идти по этому поводу являются:

Прежде всего, необходимо определить порядок, в котором он пытается присоединяется. Затем вам нужно определить логику, для которой используется соединение. Наконец, примените эту логику в случае 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).

Независимо от того, что это не только идеальные решения, которые не будут хорошо масштабироваться, а таблица будет большой. Идеальное решение - очистка данных, чтобы предоставить один идентификатор столбца, который вы могли бы использовать.

+0

ОК. Я попробовал то, что вы предложили. Я выбрал ошибку исключения из памяти. – arcee123

+0

Вы можете попробовать запустить его на сервере, но запрос берет всю вашу локальную память и может влиять на сервер в зависимости от ресурсов. Является ли очистка данных для предоставления идентификатора одного столбца? Если нет, вы можете попробовать проверить его ограничение набора результатов. –

+0

ОК. Я пытался настроить столбец, но я не знаю, что добавить туда. как я узнаю, какое преобразование нужно поместить там, когда я не знаю, что нужно для соединения? (три возможности)? благодаря – arcee123

Смежные вопросы