2013-02-01 37 views
1

我比较两个不同数据库中的帐号以确保帐号在两者中都存在。一个数据库中的帐户字段为nvarchar,另一个为varchar。我做了一个演员将他们都投到varchar(12)并加入他们看看哪里没有一场比赛。如果有少于12个字符的帐号,则认为它不匹配。我假设每个字段中的额外字符导致了这个问题?加入varchar和nvarchar

table1 - accountnumber(nvarchar(255)) 
table2 - accountnumber(varchar(20)) 

select * from 
table1 
left outer join table2 on table2.accountnumber = table1.accountnumber 

在这个例子中,两个表都有一个12345678号的帐号,但是这个连接不起作用。我不确定它是否是数据类型不匹配或空白区域或其他。

- 添加 - 我应该补充一点,table2中的数据实际上源于Oracle数据库,它以varchar2(12字节)的形式存储。我将它导入SQL Server数据库,并以varchar(20)形式存储。我不确定这是否有所作为。

+2

你到底需要什么帮助? –

+0

连接两个表table1中 - ACCOUNTNUMBER(为nvarchar(255)) 表2 - ACCOUNTNUMBER(VARCHAR(20)) SELECT * FROM表1 左外连接上table2.accountnumber表2 = table1.accountnumber –

+0

我们是否可以假设你是使用SQL Server? – bonCodigo

回答

1

不知道你在哪里有问题。该查询应该返回匹配帐号(无需CAST):

SELECT * 
FROM YourTable 
    JOIN YourOtherTable ON YourTable.AccountNumber = YourOtherTable.AccountNumber 

如果您的数据中有空格,可以修剪你的数据取决于您的RDBMS - LTRIM和RTRIM为SQL Server。

SELECT * 
FROM YourTable 
    JOIN YourOtherTable ON RTRIM(LTRIM(YourTable.AccountNumber)) = RTRIM(LTRIM(YourOtherTable.AccountNumber)) 

这里是SQL Fiddle

祝你好运。

+0

但sql server执行计划将显示类型转换可能会影响寻找计划。所以如何处理。我的意思是优化查询。 –

1

您的查询工作正常。这可能是一个字符编码问题。尝试使用collate。请参阅this以前的答案可能有所帮助。

0

我遇到了完全相同的情况,我甚至有两个兄弟查询(一个创建为另一个副本),它们都有这个问题。整理和类型在这里没有问题。

最后,经过很多测试,其中一个查询开始工作,没有发生明显的变化,只是重新编写。当我重新输入第二个查询的IN部分时,它也开始工作。 因此,隐藏字符在查询中某处意外键入时出现问题。