2012-10-25 138 views
1

我遇到了子查詢/聯合問題。MySQL子查詢返回假數據

這是我想要的:我有一個「備份表」(它用於某些目的,而不僅僅是備份)的訂單,我稱之爲dc_all_orders。我有兩個其他表,wb_orders和wb_printed。訂單首先進入wb_orders,然後在工作流程步驟之後進入wb_printed。 我們已經看到有些訂單項缺失,我們在備份表中有,但沒有在兩個主要的訂單表中。我想計算受影響的orderItems。我知道100%,計數應該是0以上,但是它一直返回零。一個項目應該包括的例子:

mysql> select orderId,productId from dc_all_orders where productId = '22040247153891'; 
+---------------------+----------------+ 
| orderId    | productId  | 
+---------------------+----------------+ 
| 20319833369460309A | 22040247153891 | 
+---------------------+----------------+ 
1 row in set (2.06 sec) 


mysql> select * from wb_orders where productId = '22040247153891'; 
Empty set (0.00 sec) 

mysql> select * from wb_printed where productId = '22040247153891'; 
Empty set (0.00 sec) 

所以這個productId應該顯示出來。現在:

mysql> select count(*) from (select productId from wb_orders UNION select productId from wb_printed) as x; 
+----------+ 
| count(*) | 
+----------+ 
| 4295961 | 
+----------+ 
1 row in set (2 min 51.80 sec) 

所以你知道我們有多少數據。

mysql> select count(*) from dc_all_orders WHERE productId NOT IN 
    -> (select productId from wb_orders UNION select productId from wb_printed); 
+----------+ 
| count(*) | 
+----------+ 
|  0 | 
+----------+ 
1 row in set (11 min 9.20 sec) 

我無法解釋它。我用不同的方式嘗試過,但每種方式都顯示爲0.我所能想到的只是子查詢的大小,但我檢查了日誌,沒有錯誤,並且如您所見,返回的結果沒有錯誤。

我錯過了明顯? :)

這裏是另一種方式:

mysql> select count(productId) from dc_all_orders WHERE productId NOT IN (select productId from wb_orders) AND productId NOT IN (select productId from wb_printed); 
+------------------+ 
| count(productId) | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (6 min 3.07 sec) 

編輯:MySQL的版本: 「服務器版本:65年5月1日,由曼月樂曼月樂®社區項目分佈」 上一個CentOS 5.8

+0

什麼是數據類型涉及哪些重複?看起來你可能會面臨整數溢出...... –

+0

productId字段是varchars。 –

+0

如果你只包含兩個表中的一個,該怎麼辦?它的工作原理是什麼?[select count(productId)from dc_all_orders WHERE productId NOT IN(select productId from wb_orders)](我知道這不是一個解決方案,只是爲了檢查會發生什麼) – richardtz

回答

0

我的天堂沒有找到最後的結果,但是MySQL似乎對子查詢有一定的限制,可以與IN (subquery)一起使用。在參考文獻中"restrictions on subqueries"當然沒有提到,但它發生在我之前。解決方案是以不同的方式編寫查詢。

例如,你可以嘗試使用​​:

select count(productId) from dc_all_orders a WHERE 
    NOT EXISTS (select 1 from wb_orders o where a.productId = o.productId) 

或者你可以寫一個LEFT JOIN查詢,雖然這是一個有點麻煩(如果有多個條目wb_orders對於給定productId你」會得到重複,刪除你必須申請group bydistinct這取決於你想做的事......)

select count(distinct a.productId) from dc_all_orders a LEFT JOIN wb_orders o 
    ON a.productId = o.productId WHERE o.id IS NULL