2015-05-26 33 views
0

這讓我瘋狂!合併拉零作爲值

我有三張桌子。第一個表格包含所有記錄以及其他數據(區域,日期等)的列表。第二個和第三個表格包含所有小時/成本數據,但第二個表格僅包含歷史記錄,第三個表格包含較新的記錄。我希望我的聯合首先嚐試在較新的記錄中查找值,但如果找不到記錄,請查看歷史記錄表。出於某種原因,即使我知道有一個歷史悠久的表中的值,我的聚結的結果來作爲0

Table1 

ID  Region 
1  US 
2  US 
3  Europe 
4  US 
5  Europe 
6  US 

Table2 

ID  Hours 
1  10 
2  15 
3  20 


Table3 

ID  Hours 
4  3 
5  7 
6  4 

所以,我的發言是這樣寫的:

SELECT t1.ID, COALESCE(t3.hours, t2.hours) AS HOURS FROM table1 t1 LEFT JOIN table2 t2 ON t1.ID=t2.ID LEFT JOIN table3 t3 ON t1.ID=t3.ID

現在,由於某種原因,如果在t3中找到該值(較新的記錄),它會提取正確的值,但如果找不到值並且必須從t2中提取一個值,則會拉入一個0而不是實際值。結果是這樣的:

ID  HOURS 
1  0 
2  0 
3  0 
4  3 
5  7 
6  4 

我的猜測是,它是與表2(我都列設置爲VARCHAR(55)列的類型,但我不能找到解決數據的任何規則。類型COALESCE函數關於有與聚結只使用某列型

感謝任何指導

編輯追加結果斯賓塞的詢問:

ID  t2.hours + 0 t2.hours hex(t2.hours) length(t2.hours) 
413190 240   240   F0     3 
+1

最後一個表加入的'on'不應該是't1.id = t3.id'嗎?還是僅僅是一個錯字? – xQbert

+0

你的查詢看起來很好。這是一個[SQL小提琴](http://sqlfiddle.com/#!3/e3f43/5/0)顯示它的工作原理。我認爲你的數據問題在某個地方被你的問題混淆 – xQbert

+0

你說't2'中的'hours'列是VARCHAR(55)。表達式的值看起來是正確的,'240'是一個字符串,長度爲3個字節,計算結果爲數值'240'。 HEX的輸出很奇怪。如果這個列是拉丁字符集,肯定會返回'323430'。 'F0'的返回非常奇怪。解釋爲等於十進制(15 * 16)+(0 * 1)='240'的整數值(TINYINT)。很奇怪。 「小時」專欄的特點是什麼?什麼版本的MySQL?('SHOW CREATE TABLE table2'的輸出和'SHOW VARIABLES LIKE'的輸出版本%'' – spencer7593

回答

2

不正確的加入:

FROM table1 t1 
LEFT JOIN table2 t2 ON t1.ID=t2.ID 
          ^
LEFT JOIN table3 t3 ON t1.ID=t2.ID 
          ^

您正在使用從表2

+0

Marc B - 我的例子中,我的加入聲明錯誤是正確的,但不幸的是,當我設置所有內容來提出問題時(我編輯它),這只是一個哎呀。在我的實際SQL查詢中,連接都是完美的。 – sqlnewb

0

它看起來像的t2.hoursCOALESCE功能正在數字方面所做的評估,價值加入表3和存儲的值在hours列中評估的數值爲0

一個快速的方法來檢查是評估什麼數字加一個零,如在此查詢的第一個表達式:

SELECT t2.hours + 0 
     , t2.hours 
     , HEX(t2.hours) 
     , LENGTH(t2.hours) 
    FROM table2 t2 

我很好奇的是查詢顯示行的一個是從COALESCE表達式返回0,數字評估是否返回0,以及列值中是否有任何主要的奇怪字符。

+0

嗨Spencer7593,在我的現實生活數據庫中的真實生活專欄上做了上述工作,我在其中一個展示有問題行爲的記錄中得到了以下結果。一些行具有全部數字的十六進制,並且一些具有字母數字值(如該ID那樣): ID t2.hours + 0 t2.hours hex(t2.hours)length(t2.hours) 413190 240 240 F0 3 不確定F0表示什麼。 – sqlnewb

+0

我在上面編輯了我的問題,以顯示我從您的支票中得到的結果。它不會讓我添加評論沒有愚蠢的格式:) – sqlnewb