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;

示例:SQLFiddle

为了优化上述查询,添加以下复合索引应该会给你更好的性能:

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
        )

这不是自联接,但查询优化器可以自由地执行它(通常会这样做。)

于 2012-09-07T08:11:12.543 回答