MySQL子查询返回false数据

时间:2012-10-25 15:45:19

标签: mysql database

我遇到了子查询/联合的​​问题。

这就是我想要的:我有一个“备份表”(它用于某些目的,而不仅仅是备份)用于订单,我称之为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)

所以这个产品应该出现。现在:

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版本:“服务器版本:由IUS社区项目分发的5.1.65-ius”在CentOS 5.8上

1 个答案:

答案 0 :(得分:0)

我还没有找到它的底部,但MySQL确实对子查询有一些大小限制,可以与IN (subquery)一起使用。在参考文献"restrictions on subqueries"中肯定没有提到它,但它在我之前发生过。解决方案是以不同的方式编写查询。

例如,您可以尝试使用EXISTS (subquery)

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