Запрос, который возвращает строки с обоими значениями в операторе IN - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь написать запрос, который возвращает все строки, которые имеют оба значения предложения IN в таблице, и они имеют общий порядок #

Например, у меня есть

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

Это работает с одним вводом 1234 как the order num, я изо всех сил пытаюсь написать запрос, который не требует ввода, но возвращает все заказы, которые имеют как обновление, так и создание.

Я пытался написать подзапрос для той же таблицы, но не был уверен, является ли это наилучшей практикой или нет.

Ответы [ 3 ]

4 голосов
/ 28 июня 2019

Я думаю, вам нужно группировать с having предложением

SELECT order_num
  FROM order_table
 WHERE order_type IN ('update','create')
 GROUP BY order_num
HAVING count(distinct order_type)=2
0 голосов
/ 29 июня 2019

Я думаю, что самое простое - использовать 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'
    );
0 голосов
/ 28 июня 2019

Другим подходом было бы присоединиться к order_table один раз для набора «create» и один раз для набора «update», а затем присоединиться к ним.

при условии, что у ваших созданий нет символа 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, когда type создается, и индексы для order_type / Order_num, скорее всего, будутпомочь с производительностью, если это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...