重写 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 的订单。
我有一个 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 的订单。