左连接2个varchar字段不起作用

时间:2014-06-24 08:40:58

标签: sql sql-server sql-server-2008

我无法在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中,但它们并不匹配

我试图更换空间,但它非常慢而且不起作用。我认为它与空白有关但我找不到合适的命令来实现我想要的东西。

如果我遗漏任何东西,请跟我一起,因为我是新手,我也到处寻找答案,但找不到适合我的答案。

非常感谢任何帮助

麦克

3 个答案:

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

如果您的排序规则区分大小写,则只需要较低的数据......