重写 sql 查询以获得更好的优化

Rewrite a sql query for better optimization

我有一个 table 具有以下数据

id orderid
1 0
1 1
1 2
2 0
3 0
3 1

一个id可以有多个order id。如果一个 id 只有一行 orderid 为 0,则表示尚未下订单。没有下单的id我都找到了

这是我想出的

Select *
From (
    Select
      id,
      orderId,
      Count(id) Over (partition by id) 'cntId'
    From table
) a
Where a.cntId = 1
and a.Orderid = 0

有没有更好的方法来编写这个查询?如果有任何帮助,我将不胜感激。

如果你想采用聚合方法,我更喜欢:

SELECT id
FROM yourTable
GROUP BY id
HAVING MIN(orderid) = MAX(orderid) AND MIN(orderid) = 0;

此查询应受益于 (id, groupid) 上的索引。

我的回答不是 select groupid 值,但我们已经知道对于整个结果集,该值必须为零。

你可以这样试试

SELECT id
FROM yourTable
GROUP BY id
HAVING count(*)=1
       and max(orderid)=0;

如果您知道 / 订单 ID 的顺序将始终为 0、1、2 等,并且您在 (id, orderid) 上有一个索引,我会自行加入,因此不需要查询那些可能有 100+ 个订单的 ID

select
      yt.id
   from
      YourTable yt
         LEFT JOIN YourTable yt2
            on yt.id = yt2.id
           and yt2.orderid = 1
   where
          yt.orderid = 0
      AND yt2.id is null

所以它只会关心订单 ID = 0 或 1,return 只关心那些没有找到 orderID = 1 的订单。