Mysql 如果列值不在另一列的组中,则SQL选择行';s值

Mysql 如果列值不在另一列的组中,则SQL选择行';s值,mysql,sql,join,group-by,hive,Mysql,Sql,Join,Group By,Hive,对于每个标识符,当收到的国家/地区不等于任何交付的国家/地区时,如何返回数量?我需要一个有效的查询,因为我的表很大 这些是我认为可以做到这一点的步骤,当然你不需要遵循它们:) 为每个标识符创建一组“已交付”国家/地区 查看每个标识符的“received”是否为这些国家/地区中的任何一个。如果 没有匹配项,请返回此结果 起始表: identifier delivered received quantity ------------- -

对于每个标识符,当收到的国家/地区不等于任何交付的国家/地区时,如何返回数量?我需要一个有效的查询,因为我的表很大

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

  • 为每个标识符创建一组“已交付”国家/地区
  • 查看每个标识符的“received”是否为这些国家/地区中的任何一个。如果 没有匹配项,请返回此结果
  • 起始表:

    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 
    

    起始表大约有30000000行,因此很遗憾,自联接是不可能的。我正在使用类似于MySQL的东西

    我认为
    左连接
    查询应该适合您:

    SELECT a.*
    FROM starting a
         LEFT JOIN starting b
            ON a.id = b.id
               AND a.delivered = b.received
    WHERE b.received IS NULL;
    
    例子: 为了优化上述查询,添加以下复合索引应能提供更好的性能:

    ALTER TABLE starting  ADD KEY ix1(id, delivered, received);
    

    您可以使用
    不存在
    子查询:

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

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

    这或“…WHERE received not IN(SELECT delived WHERE identifier=1)”也应该执行。这不会产生笛卡尔积吗?如果我的起始表如上所述,那么在处理过程中会产生多少行?问题是“不可能进行自连接”原始表几乎有10亿行,因此如果我开始产生交叉积,查询可能无法工作。不,它不会产生笛卡尔积。此查询可以使用索引。查看
    解释
    或查看执行计划此处: