查询返回在IN语句中具有两个值的行

时间:2019-06-28 19:36:12

标签: sql oracle

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

例如我有

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

另一种方法是,对于“创建”集一次加入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的索引可能会有助于提高性能。

答案 2 :(得分:0)

我认为最简单的就是使用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'
    );