2017-03-09 94 views
1

我试图左侧连接两个表在同一台服务器上,但不同的数据库使用标题为'凭证'的字段。这些字段包含完全相同的数据,但存储为不同的数据类型。在表a上,凭证以nvarchar存储,在表b上以字符形式存储。加入相同的字段,不同的数据类型

当我运行我的查询时,我从表b得到了很多凭证的空值。如果我分别对表运行查询,则可以看到表b中的值作为连接查询中的空值出现。

这里的任何帮助将是巨大的。

+1

你可以添加一些样本数据和所需的结果? – McNets

+0

A.Acct#A.VOUCHER \t B.Acct#\t B.Voucher 123456789 UXXXXXXXX NULL NULL 123456789 UXXXXXXXX NULL NULL上面是我目前收到的。预计表b值将填入相同的数据。这里是我的连接:在tableb.voucher = tablea.voucher上左连接tableB。正如我前面提到的,相同的数据,但不同的数据类型。 – bwrow24

+1

请您编辑*您的问题,请不要在评论部分添加其他详细信息:) – bc004346

回答

0

字符类型有附加空格来填充列长度。您需要在加入时修剪字符字段:

left join tableB on rtrim(tableb.voucher) = tablea.voucher 
+0

我试过这个连接,但仍然得到相同的结果:左连接#b在ltrim上(rtrim(b.VOUCHER))= ltrim(rtrim(#a.VOUCHER)) – bwrow24

+0

我只是尝试了上面建议的表b上的rtrim,但我仍然得到相同数量的空值。 – bwrow24

+0

你可以尝试删除输入字符吗?我曾经有过这种情况。 –

0

这两种数据类型应该在大多数数据库中隐式转换。它不会关心char增加的空间。

即使看起来相同,有时数据也不一样。请参阅下面的SQL Server的代码(我没有展示使用SQL Server对那些在结果集):

创建数据

create table #temp (id varchar (10)) 
create table #temp2 (id char(10)) 
truncate table #temp2 
insert into #temp values ('test1') 
insert into #temp values ('test' +Char(13)) 
Insert into #temp2 values ('test1') 
insert into #temp2 values ('test') 

查询#TEMP

select * from #temp 

数据返回

id 
test1 
test 

查询#临时2

select * from #temp2 

数据返回

id 
test1  
test  

连接查询

select t.id as tid , t2.id as t2id from #temp t 
left join #temp2 t2 on t.id = t2.id 

数据返回

tid  t2id 
test1 test1  
test NULL 

正如你所看到的,如果你运行它,那将无法打印的字符(在此大小写回车)使得这些值不再匹配连接。如果你的表中有这样的数据,那么值就不一样了。为了更具体地解决问题,我必须知道你使用的数据库后端。

+0

我正在使用SQL Server Management Studio 2012. – bwrow24

+0

这是否有帮助或您是否需要更多信息来建议特定的修补程序? – bwrow24

+0

现在的问题是您需要清理数据本身(并为应用程序写一个修复程序以防止不可打印的字符永远不会渗入)或者您是否需要将这些字符保留在具有这些字符的表中? – HLGEM

相关问题