我无法在sql server 2008上加入两个varchar(31)字段。下面是我的查询,它工作正常
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
尽管南非和英国都在dbs中,但它们并不匹配
我试图更换空间,但它非常慢而且不起作用。我认为它与空白有关但我找不到合适的命令来实现我想要的东西。
如果我遗漏任何东西,请跟我一起,因为我是新手,我也到处寻找答案,但找不到适合我的答案。
非常感谢任何帮助
麦克
答案 0 :(得分:4)
尝试在两个表上执行以下查询。这将告诉你是否有任何"隐藏"表之间的差异(例如,空白字符,换行符等):
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), ' ')
答案 1 :(得分: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))
答案 2 :(得分: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
如果您的排序规则区分大小写,则只需要较低的数据......