2015-07-23 4 views
0

У меня возникают проблемы с запросом базы данных Oracle и связанными подзапросами. В его основе проблема заключается в подсчете количества раз, когда идентификатор из одной таблицы встречается в другой таблице.Подсчет вхождений идентификатора в таблицу базы данных

Проблема: У меня есть две таблицы, таблица заказов, в которой хранится информация о заказанных элементах из веб-службы. Данные из этой таблицы запускаются через процесс (который я не контролирую), и результат помещается в выполненную таблицу.

Номера для заказа: не уникально для одного предмета. Каждый заказ может иметь большое количество предметов, и каждый элемент хранится на линии . Однако элементы могут быть комбо/пакетом, и это то, что обрабатывается процессом. Например, элемент GAME_PACK может войти в таблицу заказов, а на другом конце - GAME1, GAME2, GAME3 и связан с номером заказа.

Simple diagram representing the order process

Проблема заключается в том, иногда эти вещи не выходят из процесса правильно, а затем Line_Item не может быть связано с выполненной пункта. Единственный способ, с помощью доступных ресурсов, определить, есть ли проблема, - получить максимальное значение_имя и сравнить это с числом групп execute.item.

Что я пробовал: Сначала я думал, что это будет довольно просто сделать, просто используя rownumber() или denserank() аналитической функции над перегородкой по порядковому номеру, но он стал гораздо более запутанным, чем , Это в настоящее время запрос я работаю с:

select * 
from(
    select max (item_index) over (partition by tbl.item_number) item_count, tbl.* 
     from (
      select i.item_fulfill_number, i.order_number, row_number()over(partition by i.item_number, i.order_number order by i.order_number) item_index 
      from fulfilled_items i) tbl 
      ) results 
      inner join (
       select * 
       from (
        select orderinfo.order_number as order_order_number, orderinfo.line_number, orderinfo.ordered_item, row_number() over(partition by orderinfo.order_number order by orderinfo.line_number desc) order_row 
        from orderinfo 
        ) 
       where order_row <= 1 
       ) 
      on results.order_number = order_order_number 
where results.item_count = results.item_index and ordered_item like 'GAME%' 

отмечают, что сейчас я вытягивать, когда совпадают отсчеты, эта логика будет обращена вспять, когда я уверен, запрос работает

сдерживающих

  • я не иметь доступ к процессу, который разделяет элементы
  • запрос должен работать быстро, мы работаем с свыше 50000 возможных записей
  • Запрос был протестирован на 22 секунд в течение 2 минут времени выполнения
  • Pagination будет использоваться, если вы ответите, не беспокойтесь о включая, но это что-то рассмотреть, потому что это может сильно помочь или повредить скорость запроса
  • Я не могу коснуться структуры таблицы

Структура таблицы и графики Представление The relation between the orders table and the fulfilled items table after the process has run (Максимальное количество линии представляют собой число fulfilled_item групп)

Спасибо, что нашли время, чтобы прочитать это.

EDIT Результаты должны выглядеть следующим образом: a sample output for the query

где деталь приходит из таблицы заказов, и результат в порядке, BAD, основанный на соответствуют ли или не отработавшим группам максимального числа строк.

+0

посмотреть, как будет выглядеть конечный результат, было бы полезно – JamieD77

+0

@ JamieD77 Добавлен быстрый образец вывода. Я поставлю лучший в течение часа – Matt

+1

что бы выполнил таблицу строк '123 | 444' представляют? что даст вам 4 группы с 3 номерами строк. – JamieD77

ответ

0

Если я правильно понимаю, каждый заказ должен иметь одинаковое количество групп выполнения, так как в порядке номеров строк. Каждая группа выполнения будет иметь неизвестный размер и будет представлена ​​уникальным номером исполнения. Исходя из этого, я думаю, что запрос должен быть столь же простым, как это:

SELECT 
    main.*, 
    'BAD' AS result 
FROM (
    SELECT DISTINCT 
     o.order_number, 
     COUNT(o.line_number) OVER (PARTITION BY o.order_number) AS order_lines, 
     (SELECT COUNT(DISTINCT item_fulfill_number) FROM fulfilled_items f WHERE f.order_number = o.order_number) AS fulfilled_groups 
    FROM orders o 
) main 
WHERE order_lines != fulfilled_groups 

подзапрос подсчитывает количество строк (только в случае, если номер строки получает пропускаются, но вы можете изменить это обратно в макс на номер строки, если вы действительно этого хотите) и количество отдельных групп выполнения. Общий запрос возвращает те заказы, где два счета не равны.

+0

Единственная проблема, с которой я столкнулся, - это время выполнения запроса. Сотрудник предложил аналогичное решение, используя различные, поэтому я сделаю это. База данных в настоящее время недоступна, поэтому я отправлю сообщение с обновлением, когда я сделаю снимок. – Matt

+0

К сожалению, этот запрос выполняется медленнее, чем я опубликовал в исходном вопросе, и я был вынужден убить его через 8 минут. отмена все еще ожидает. Ожидание вызова от администратора базы данных. Спасибо за то, что он сделал снимок, я ценю помощь – Matt

Смежные вопросы