Mysql 如果列值不在另一列的组中,则SQL选择行';s值
对于每个标识符,当收到的国家/地区不等于任何交付的国家/地区时,如何返回数量?我需要一个有效的查询,因为我的表很大 这些是我认为可以做到这一点的步骤,当然你不需要遵循它们:)Mysql 如果列值不在另一列的组中,则SQL选择行';s值,mysql,sql,join,group-by,hive,Mysql,Sql,Join,Group By,Hive,对于每个标识符,当收到的国家/地区不等于任何交付的国家/地区时,如何返回数量?我需要一个有效的查询,因为我的表很大 这些是我认为可以做到这一点的步骤,当然你不需要遵循它们:) 为每个标识符创建一组“已交付”国家/地区 查看每个标识符的“received”是否为这些国家/地区中的任何一个。如果 没有匹配项,请返回此结果 起始表: identifier delivered received quantity ------------- -
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亿行,因此如果我开始产生交叉积,查询可能无法工作。不,它不会产生笛卡尔积。此查询可以使用索引。查看
解释
或查看执行计划此处: