我遇到了子查询/联合的问题。
这就是我想要的:我有一个“备份表”(它用于某些目的,而不仅仅是备份)用于订单,我称之为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上
答案 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 by
或distinct
,具体取决于您要执行的操作...)
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