2013-12-05 3 views
1

У меня есть две таблицы со следующими данными:Как соединить две таблицы с частичным совпадением

TableA.name 
R4.23-Core-2 
R4.23-Core-2 
LA#213 CGHPBXsw01 127.213 0024-737e-e341 
LA#252 CGHRack1sw01 127.252 0022-57ab-d781 
SOC-01A-SW01 
to - R4-DISTR-9512 
to-R2-DISTR-5900-1 
to-R3.25-EDGE 

TableB.caption 
R4.23-Core-2.ehd.ca 
R4.23-Core-2.nhd.ca 
CGHPBXsw01 
CGHRack1sw01 
SOC-01A-SW01 
R4-DISTR-9512 
R2-DISTR-5900-1.phsnc. 
R3.25-EDGE.phsne.edjc.ca 

Я попытался с помощью следующих присоединиться заявление, но это не похоже на работу для любой строки с а. в этом.

dbo.TableA.Name 
INNER JOIN dbo.TableB.Caption 
    ON dbo.TableA.Name LIKE '%' + dbo.TableB.Caption + '%' 

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

Я мог бы попытаться использовать функцию ПРАВИЛЬНО или ЛЕВУЮ, чтобы нормализовать данные, но для строки, у которой нет '.' это вызовет ошибку. И я не знаю, как пропустить строку, которая не имеет.

Каков наиболее эффективный способ объединения этих двух таблиц?

+0

Это соединение должно работать. Какой элемент в таблице A не подходит в TableB? – swandog

+0

Почему вы не добавляете столбец с каким-то идентификатором и присоединяетесь к этому. – Mihai

+0

@ user3072241 Если я правильно вас понимаю, вы пытаетесь присоединиться к строкам в A со строками в B, где столбец Caption в B полностью содержится в столбце Name A? Это то, что говорит ваше выражение выражения. Я попробовал это в SQL Fiddle (SQL Server 2012), и он работает так, как я ожидал. Вы используете другую базу данных? –

ответ

3

В некоторых ситуациях в вашем примере заголовок длиннее, а иногда имя больше, если вы хотите присоединиться любое значение, где имя в подписи или подпись в имени, которое вы могли бы использовать:

dbo.TableA.Name 
INNER JOIN dbo.TableB.Caption 
    ON dbo.TableA.Name LIKE '%' + dbo.TableB.Caption + '%' 
    OR dbo.TableB.Caption LIKE '%' + dbo.TableA.Name + '%' 

Это может объяснить, почему ваш запрос не работает должным образом.

Что касается наиболее эффективного способа сделать это, вы хотите иметь стандартизованное поле в своей таблице, которое вы можете использовать для JOIN с помощью равенства (например, a.col1 = b.col1), так что повлечет за собой отсечение сердца каждого поля, что делает его достойным присоединения.

Update: Если важная часть все до первого периода, то вы хотите использовать комбинацию LEFT() и CHARINDEX()CASE заявление, поскольку не все строки содержат период):

SELECT NewField = CASE WHEN CHARINDEX('.',Name) > 0 THEN LEFT(Name,CHARINDEX('.',Name)-1) 
         ELSE Name 
        END 
FROM YourTable 

You мог бы использовать приведенное выше в вашем JOIN:

dbo.TableA.Name 
INNER JOIN dbo.TableB.Caption 
    ON CASE WHEN CHARINDEX('.',TableA.Name) > 0 THEN LEFT(TableA.Name,CHARINDEX('.',TableA.Name)-1) 
          ELSE TableA.Name 
         END 
    = CASE WHEN CHARINDEX('.',TableB.Caption) > 0 THEN LEFT(TableB.Caption,CHARINDEX('.',TableB.Caption)-1) 
          ELSE TableB.Caption 
         END 
+0

Я хочу стандартизировать это и попытался использовать функцию ПРАВО: – user3072241

+0

Можете ли вы описать, какая часть значения поля является важной частью? –

+0

Итак, я постарался представить в таблице TableB TableB.caption R4.23-Core-2.ehd.ча R4.23-Core-2.nhd.ca CGHPBXsw01 CGHRack1sw01 SOC-01A-SW01 R4-9512-УЛ R2-УЛ-5900-1.phsnc. R3.25-EDGE.phsne.edjc.ca с помощью ВЛЕВО (dbo.TableB.Caption, CHARINDEX (, dbo.TableB.Caption) '' - 1) Но я получаю ошибку, когда он достигнет любой строки у которого нет '.' например CGHPBXsw01 Единственный способ, которым я знаю, чтобы получить эту ошибку, - это использовать NULLIF, но это вернет NULL в эту строку, а не фактическое значение строки – user3072241

0

Как об этом (не тестировался)

dbo.TableA 
INNER JOIN dbo.TableB 
     ON CHARINDEX(dbo.TableB.Caption, dbo.TableA.Name) > 0 

Test это и не забудьте Upvote или принять.

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