请教一下各位 oracle 大神,如果以多行数据作为条件匹配可以怎么写?

56 天前
 oracleHe

假设现在有这两个表:

1.订单表:t_order

order_id title creat_time
1 张三的订单 2024-01-01
2 李四的订单 2024-03-01

2.订单明细表:t_order_detail

order_id item_type_id item_type item_name
1 01 电子产品 电脑
1 01 电子产品 手机
1 02 办公用品 记事本
2 01 电子产品 鼠标
2 02 办公用品 鼠标垫

比如我要查到既有买 电子产品电脑 也有买 办公用品记事本 的订单 t_order 的记录,也就是:

item_type_id = '01' and item_name = '电脑' 且 item_type_id = '02' and item_name = '记事本'

这样的订单。

我尝试过搜索有推荐使用 group by + having 的方式进行查询的。类似如下的写法:

SELECT o.order_id
FROM t_order o
JOIN t_order_detail od ON o.order_id = od.order_id
GROUP BY o.order_id
HAVING COUNT(CASE WHEN od.item_type_id = '01' AND od.item_name = '电脑' THEN 1 end) > 0 
	and COUNT(CASE WHEN od.item_type_id = '02' AND od.item_name = '记事本' THEN 1 end) > 0

但是由于我实际的场景下,数据量会比较大,而且涉及的关联表也会比较多,使用 group by 会导致特别特别慢。所以想请教下有没有更好的方法。

740 次点击
所在节点    Oracle
1 条回复
CapNemo
56 天前
SELECT o.order_id
FROM t_order o
JOIN t_order_detail od ON o.order_id = od.order_id and od.item_name = '电脑'
JOIN t_order_detail od2 ON o.order_id = od2.order_id and od2.item_name = '记事本'
GROUP BY o.order_id

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1105515

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX