V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oracleHe
V2EX  ›  Oracle

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

  •  
  •   oracleHe · 2 天前 · 199 次点击

    假设现在有这两个表:

    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 会导致特别特别慢。所以想请教下有没有更好的方法。

    1 条回复    2025-01-16 14:55:52 +08:00
    CapNemo
        1
    CapNemo  
       2 天前
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2916 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 07:37 · PVG 15:37 · LAX 23:37 · JFK 02:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.