這讓我瘋狂!合併拉零作爲值
我有三張桌子。第一個表格包含所有記錄以及其他數據(區域,日期等)的列表。第二個和第三個表格包含所有小時/成本數據,但第二個表格僅包含歷史記錄,第三個表格包含較新的記錄。我希望我的聯合首先嚐試在較新的記錄中查找值,但如果找不到記錄,請查看歷史記錄表。出於某種原因,即使我知道有一個歷史悠久的表中的值,我的聚結的結果來作爲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
最後一個表加入的'on'不應該是't1.id = t3.id'嗎?還是僅僅是一個錯字? – xQbert
你的查詢看起來很好。這是一個[SQL小提琴](http://sqlfiddle.com/#!3/e3f43/5/0)顯示它的工作原理。我認爲你的數據問題在某個地方被你的問題混淆 – xQbert
你說'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