如果列值不在不同列的值的组中,则SQL选择行

时间:2012-09-07 07:48:24

标签: mysql sql join group-by hive

对于每个标识符,当收到国家/地区不等于已发送的<时,如何返回数量 / strong>国家/地区?我需要对下面的步骤进行有效的查询,因为我的表很大。

这些是我认为可以做到的步骤,当然你不需要遵循它们:)

  1. 为每个标识符创建一组“已投放”国家/地区。
  2. 查看每个标识符的“已收到”是否属于这些国家/地区。如果 没有匹配,返回此结果。
  3. 开始表:

    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的东西。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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
        )

这不是自联接,但查询优化器可以自由地将其作为一个执行(并且通常会执行。)