对于每个标识符,当收到国家/地区不等于已发送的<时,如何返回数量 / strong>国家/地区?我需要对下面的步骤进行有效的查询,因为我的表很大。
这些是我认为可以做到的步骤,当然你不需要遵循它们:)
开始表:
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的东西。
答案 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;
为了优化上述查询,添加以下复合索引应该会为您提供更好的性能:
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
)
这不是自联接,但查询优化器可以自由地将其作为一个执行(并且通常会执行。)