SQL 服务器 - Exists 的替代方案(子查询太多)
SQL Server - Alternative to Exists (too many subqueries)
我正在寻找一种方法来提高具有太多现有链接子查询的查询的性能。
我的问题是我有一个订单详情 table,其中对于订单的每个项目,都有一个特定的类别(存储在另一个 table 中,但现在这无关紧要)。
我必须根据该类别的不同组合检测特定的 "group" 订单:
- A 组:商品类别为 13 + 15 + 任何 (66, 67, 68, 69) 的订单
商品类别为 77 + 78 + (66, 67, 68, 69, 71, 71)
到目前为止,我所做的是使用链接存在的巨大查询来查找满足该条件的订单,但这是一个性能噩梦。
我希望有更好的方法来做到这一点,因为我的 table 有数百万条记录...
非常感谢!!!
不清楚您的数据库的结构,但您可以尝试类似的操作:
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)
这 returns 所有订单有:
- 至少 1 个类别 13 and
- 至少 1 个类别 16 and
- 至少 1 个类别 66、67、68 或 69 的详细信息
我会使用 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
)
我正在寻找一种方法来提高具有太多现有链接子查询的查询的性能。
我的问题是我有一个订单详情 table,其中对于订单的每个项目,都有一个特定的类别(存储在另一个 table 中,但现在这无关紧要)。
我必须根据该类别的不同组合检测特定的 "group" 订单: - A 组:商品类别为 13 + 15 + 任何 (66, 67, 68, 69) 的订单 商品类别为 77 + 78 + (66, 67, 68, 69, 71, 71)
到目前为止,我所做的是使用链接存在的巨大查询来查找满足该条件的订单,但这是一个性能噩梦。
我希望有更好的方法来做到这一点,因为我的 table 有数百万条记录...
非常感谢!!!
不清楚您的数据库的结构,但您可以尝试类似的操作:
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)
这 returns 所有订单有:
- 至少 1 个类别 13 and
- 至少 1 个类别 16 and
- 至少 1 个类别 66、67、68 或 69 的详细信息
我会使用 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
)