SQL Server-存在的替代方法(子查询太多)

时间:2018-09-20 16:11:43

标签: sql sql-server exists

我正在寻找一种方法来提高存在太多存在的链接子查询的查询的性能。

我的问题是我有一个“订单明细表”,其中该订单的每个样式都有一个特定类别(存储在另一个表中,但是现在不相关了)。

我必须根据类别的不同组合来检测特定的订单“组”:  -A组:订单类别为13 + 15 +(66、67、68、69)中的任何一项的订单             类别为77 + 78 +(66,67,68,69,71,71)中的任何一个的命令

到目前为止,我所做的是通过链接进行巨大查询,以找到满足该条件的订单,但这是一场性能梦night。

我希望有一种更好的方法,因为我的表有数百万条记录...

非常感谢!

2 个答案:

答案 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 byhaving

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    
       )