3

識別子について、 受け取った国が配送された国のいずれとも等しくない場合、どのように数量を返すことができますか? 私のテーブルは巨大なので、以下の手順には効率的なクエリが必要です。

これらは、これを行うことができると私が考える手順です。もちろん、それらに従う必要はありません:)

  1. 識別子ごとに「配達済み」国のグループを作成します。
  2. 「受信」が各識別子のこれらの国であるかどうかを確認します。一致しない場合は、この結果を返します。

開始テーブル:

identifier         delivered            received        quantity
-------------      ------------         -----------     ------------
1                  USA                  France          432
1                  France               USA             450
1                  Ireland              Russia          100
2                  Germany              Germany         1,034
3                  USA                  France          50
3                  USA                  USA             120

結果:

identifier         delivered            received        quantity
-------------      ------------         -----------     ------------
1                  Ireland              Russia          100 

開始テーブルは約 30,000,000 行なので、残念ながら自己結合は不可能です。MySQLに似たものを使用しています。

4

2 に答える 2

6

LEFT JOINクエリがうまくいくと思います:

SELECT a.*
FROM starting a
     LEFT JOIN starting b
        ON a.id = b.id
           AND a.delivered = b.received
WHERE b.received IS NULL;

例: SQLフィドル

上記のクエリを最適化するには、次の複合インデックスを追加すると、パフォーマンスが向上します。

ALTER TABLE starting  ADD KEY ix1(id, delivered, received);
于 2012-09-07T07:55:28.890 に答える
0

not existsサブクエリを使用できます:

SELECT  a.*
FROM    starting a
WHERE   NOT EXISTS
        (
        SELECT  *
        FROM    starting b
        WHERE   a.id = b.id
                AND a.delivered = b.received
        )

これは自己結合ではありませんが、クエリ オプティマイザーはそれを 1 つの結合として自由に実行できます (通常は実行します)。

于 2012-09-07T08:11:12.543 に答える