2014-06-24 3 views
0

Im возникают проблемы, соединяющую два VARCHAR (31) поля на SQL Server 2008. Ниже мой запрос и он работает отличноВыравнивание по левому краю на 2 VARCHAR полях не работают

select A.CustId,A.Country,B.Country from [ACC].[dbo].[Customer] as A 
left join 
[Task Centre].[dbo].[CountryCodes] as B on A.Country=B.Country] 

результаты являются

CustomerA United Kingdom Null 
CustomerB Ireland   Ireland 
CustomerC Spain    Spain 
CustomerD South Africa  Null 

Южная Африка и Соединенное Королевство не совпадают, даже если они находятся в обоих д.б.н.

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

Принесите меня, если я опустил что-либо, как Im новичок, я также искал везде для ответа, но не могу найти тот, который работает для меня.

Любая помощь очень ценится

Майк

+0

@TomTom: Возможно, это происходит в вы, что ОП может не отвечать за дизайн базы данных? Возможно, ему просто поручена задача опроса некоторых данных из старого приложения базы данных, и теперь ему нужна небольшая помощь в запросе ... Если у вас нет ничего полезного для добавления к вопросу, тогда ничего не говорите. – Dan

ответ

3

Попробуйте выполнить следующий запрос на обеих таблицах. Это скажет вам, если есть какая-либо «скрытая» разница между таблицами (например, пустые символы, разрывы строк и т.д.):

select Country, CAST(Country AS VARBINARY) AS BinaryCountry 
from [ACC].[dbo].[Customer] 
where Country = 'United Kingdom' 

select Country, CAST(Country AS VARBINARY) AS BinaryCountry 
from [Task Centre].[dbo].[CountryCodes] 
where Country = 'United Kingdom' 

Столбцом BinaryCountry должен показать другое значение, если содержание Country -колонки не совсем то же самое. Если это так, подумайте об исправлении ошибки в обеих таблицах. Как только вы убедитесь, что значение одинаково в обеих таблицах, ваше соединение должно работать нормально.

Редактировать: Проблема оказывается неразрывным символом пробела в таблице Task Center. Чтобы обойти это, используйте следующее в ваших присоединиться к критериям:

ON A.Country = Replace(B.Country, CHAR(0xA0), ' ') 
+0

Эй, дан, я думаю, что это может быть ответом на результат от United Kingdom. 0x556E69746564204B696E67646F6D и центр задач MMD db пуст. Я немного потерял, что это значит? спасибо – Mikeysadleir

+1

Ну, видимо, строка '' United Kingdom'' не существует в вашей таблице Task Center.Не могли бы вы идентифицировать запись с Великобританией каким-то другим способом вместо 'where Country = 'United Kingdom''? – Dan

+0

Извините Dan его в столицах в другом db результат 0x554E49544544A04B494E47444F4D ВЕЛИКОБРИТАНИЯ – Mikeysadleir

0

Попробуйте это:

Если какое-либо пространство в стоимости вам нужно обрезать и проверить

SELECT A.CustId, A.Country, B.Country 
FROM [ACC].[dbo].[Customer] AS A LEFT JOIN 
     [Task Centre].[dbo].[CountryCodes] AS B 
      ON LTRIM(RTRIM(A.Country)) = LTRIM(RTRIM(B.Country)) 
+0

По умолчанию SQL Server игнорирует конечные пробелы, что означает, что вы можете сократить критерии JOIN до 'LTRIM (A.Country) = LTRIM (B.Country)' – Dan

+0

Я пробовал это ранее, но он не работал, он считает, что существует разница между два поля Im сравнения. Ответ Dans выше может быть решением моей конкретной проблемы. – Mikeysadleir

0

Если разница пробельная, то я предполагаю, что это может работать для вас. Это будет медленно, хотя, так как он не будет в состоянии использовать любые показатели:

select A.CustId, 
     A.Country, 
     B.Country 
from 
(
    SELECT A.CustId, 
      A.Country, 
      LOWER(REPLACE(A.Country, ' ', '')) AS CleanedCountry 
    FROM [ACC].[dbo].[Customer] as A 
) A 
left 
join 
(
    SELECT B.Country, 
      LOWER(REPLACE(B.Country, ' ', '')) AS CleanedCountry 
    FROM [Task Centre].[dbo].[CountryCodes] as B 
) B 
    on A.CleanedCountry=B.CleanedCountry 

Вам нужно будет только ниже, если ваша сверка чувствительна к регистру ...

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