1

サブクエリ/ユニオンに問題があります。

ここに私が欲しいものがあります:私はdc_all_ordersと呼ぶ注文用の「バックアップテーブル」(バックアップだけでなく、いくつかの目的に使用されます)を持っています。他に wb_orders と wb_printed という 2 つのテーブルがあります。注文は最初に wb_orders に入り、次にワークフロー ステップの後、wb_printed に入ります。一部の orderitem が欠落していることがわかりました。これはバックアップ テーブルにありますが、2 つのメインの order テーブルにはありません。影響を受ける orderItems を数えたかったのです。カウントが 0 より大きくなければならないことは 100% わかっていますが、ゼロを返し続けます。カウントするアイテムの例:

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)

または、を使用してクエリを作成することもできますが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
于 2012-10-26T14:45:35.127 に答える