1

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

这就是我想要的:我有一个订单的“备份表”(它用于某些目的,而不仅仅是备份),我称之为 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 版本:CentOS 5.8 上的“服务器版本:由 IUS 社区项目分发的 5.1.65-ius”

4

1 回答 1

0

我还没有找到这个的底部,但 MySQL 似乎确实对可以与IN (subquery). 参考文献中的“子查询限制”中肯定没有提到,但我之前也遇到过。解决方案是以不同的方式编写查询。

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

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

或者您可以使用 a 编写查询LEFT JOIN,尽管这有点棘手(如果您有多个条目,wb_ordersproductId将获得重复项;要删除重复项,您必须应用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
于 2012-10-26T14:45:35.127 回答