2013-02-01 38 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部分時,它也開始工作。 因此,隱藏字符在查詢中某處意外鍵入時出現問題。