【问题标题】:Query that returns rows that have both values in an IN statement返回在 IN 语句中具有两个值的行的查询
【发布时间】:2019-11-10 17:38:10
【问题描述】:

我正在尝试编写一个查询,该查询返回表中具有 IN 子句的两个值的所有行,并且它们共享一个共同的顺序 #

例如我有

SELECT order_num, order_type
  FROM order_table
 WHERE order_type IN ('update','create')
   AND order_num('1234');

这适用于1234 作为the order num 的单个输入,我正在努力编写一个不需要输入但返回所有具有更新和创建的订单的查询。

我试图在同一张表上编写子查询,但不确定这是否是最佳做法。

【问题讨论】:

    标签: sql oracle group-by aggregation having


    【解决方案1】:

    我认为您需要使用having 子句进行分组

    SELECT order_num
      FROM order_table
     WHERE order_type IN ('update','create')
     GROUP BY order_num
    HAVING count(distinct order_type)=2
    

    【讨论】:

    • 我认为这可行,但我意识到当使用“更新”写入新记录时,order_num 会从“1234”更改为“1234c”,因此我必须先获得子字符串才能使用它确认这将起作用。 Group by 是否允许选择多个列?
    • @RanchDubois 如果这是一个固定规则,我的意思是每个情况都会发生,那么你可以考虑SELECT rtrim(order_num,'c') as order_num .... GROUP BY rtrim(order_num,'c') .....。不,选择列表中的非聚合列是允许的,只要它们按部分包含在分组中。
    【解决方案2】:

    另一种方法是加入 order_table 一次用于“创建”集,一次用于“更新”集,然后加入它们。

    假设您的创建没有 c 而更新...

    SELECT a.order_num, a.order_type, b.order_num, b.order_type 
    FROM order_table a
    INNER JOIN order_table b
       on a.order_num &'c' = B.order_num
      and a.order_Type ='create'
      and b.order_Type ='update'
    

    创建类型时基于函数的 order-num 索引,如果存在问题,则 order_type/Order_num 上的索引可能有助于提高性能。

    【讨论】:

      【解决方案3】:

      我认为最简单的是使用 EXISTS:

      SELECT
          RTRIM(OUTT.ORDER_NUM, 'c'),
          OUTT.ORDER_TYPE
      FROM
          ORDER_TABLE OUTT
      WHERE
          OUTT.ORDER_TYPE = 'update'
          AND OUTT.ORDER_NUM IN (
              '1234'
          )
          AND EXISTS (
              SELECT
                  1
              FROM
                  ORDER_TABLE INN
              WHERE
                  RTRIM(OUTT.ORDER_NUM, 'c') = RTRIM(INN.ORDER_NUM, 'c')
                  AND INN.ORDER_TYPE = 'create'
          );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 2019-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多