2017-03-09 50 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

相關問題