我正在寻找一种方法来提高存在太多存在的链接子查询的查询的性能。
我的问题是我有一个“订单明细表”,其中该订单的每个样式都有一个特定类别(存储在另一个表中,但是现在不相关了)。
我必须根据类别的不同组合来检测特定的订单“组”: -A组:订单类别为13 + 15 +(66、67、68、69)中的任何一项的订单 类别为77 + 78 +(66,67,68,69,71,71)中的任何一个的命令
到目前为止,我所做的是通过链接进行巨大查询,以找到满足该条件的订单,但这是一场性能梦night。
我希望有一种更好的方法,因为我的表有数百万条记录...
非常感谢!
答案 0 :(得分:0)
尚不清楚数据库的结构,但您可以尝试类似的操作:
SELECT DISTINCT
orders.order_id AS group_a_order
FROM orders
JOIN order_details od13
ON orders.order_id = od13.order_id
AND od13.category = 13
JOIN order_details od15
ON orders.order_id = od15.order_id
AND od15.category = 15
JOIN order_details od6x
ON orders.order_id = od6x.order_id
AND od6x.category IN (66, 67, 68, 69)
这将返回所有具有以下条件的订单:
-至少1个类别13 和
的详细信息
-类别1 和
的至少1个详细信息
-至少1个类别66、67、68或69的细节
答案 1 :(得分:0)
我将使用group by
和having
:
select order_id
from order_details od
group by order_id
having sum(case when category = 13 then 1 else 0 end) > 0 and -- at least one 13
sum(case when category = 15 then 1 else 0 end) > 0 and -- at least one 15
sum(case when category in (66, 67, 68, 69) then 1 else 0 end) > 0 -- at least one of these
这很容易扩展。对于第二组:
having (sum(case when category = 13 then 1 else 0 end) > 0 and -- at least one 13
sum(case when category = 15 then 1 else 0 end) > 0 and -- at least one 15
sum(case when category in (66, 67, 68, 69) then 1 else 0 end) > 0
) or
(sum(case when category = 77 then 1 else 0 end) > 0 and -- at least one 13
sum(case when category = 78 then 1 else 0 end) > 0 and -- at least one 15
sum(case when category in (66, 67, 68, 69, 71, 71) then 1 else 0 end) > 0
)