Как реструктурировать запрос для объединения таблиц вместо виртуальных таблиц? - PullRequest
1 голос
/ 30 июля 2011

У меня есть запрос, к которому присоединились две виртуальные таблицы. Есть ли способ реструктурировать этот запрос так, чтобы вместо этих таблиц в качестве виртуальных таблиц я мог присоединить их к requests в качестве обычных таблиц? Я не могу понять, как это сделать со всеми агрегатными функциями и т. Д., Содержащимися в них.

SELECT
  tr.source_id,
  temp_tri.qty_requested,
  temp_tri.qty_cancelled,
  temp_palletize.qty_palletized_on_time
FROM
  requests r
JOIN
  (
    SELECT
      request_id,
      SUM(quantity_requested) qty_requested,
      SUM(quantity_cancelled) qty_cancelled
    FROM
      request_items
    GROUP BY request_id
  ) temp_tri ON temp_tri.request_id = r.request_id
JOIN
  (
    SELECT
      tmi.request_id,
      SUM(tmi.quantity) qty_palletized_on_time
    FROM
      manifest_items tmi
    JOIN
      requests tr2 ON tr2.request_id = tmi.request_id
    JOIN
      outbd_containers toc ON toc.manifest_id = tmi.manifest_id
    JOIN
      move_segments ms ON ms.move_to_container_id = (SELECT container_id FROM containers WHERE scannable_id = toc.scannable_id)
    WHERE
      ms.action = 'MOVING'
      AND ms.move_date <= tr2.need_to_ship_by_date
    GROUP BY
      tmi.request_id
  ) temp_palletize ON temp_palletize.request_id = r.request_id
WHERE
  (tr.need_to_receive_by_date BETWEEN (TO_DATE('2011-07-01', 'YYYY-MM-DD') AND TO_DATE('2011-07-02', 'YYYY-MM-DD')))

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Oracle может при необходимости отменять вложенные представления, поэтому не пытайтесь привести их в порядок. Некоторая форма плана объяснения и описания таблиц (размер, индексы и т. Д.) Должна давать больше предложений (но, возможно, в отдельном вопросе).

Как указал Черан, вы не показываете, где таблица / представление 'tr' входит в вещи.

Я бы также сосредоточился на этом:

SELECT
      tmi.request_id,
      SUM(tmi.quantity) qty_palletized_on_time
    FROM  manifest_items tmi
    JOIN  requests tr2 ON tr2.request_id = tmi.request_id
    JOIN  outbd_containers toc ON toc.manifest_id = tmi.manifest_id
    JOIN  move_segments ms ON ms.move_to_container_id = 
          (SELECT container_id FROM containers 
          WHERE scannable_id = toc.scannable_id)
    WHERE ms.action = 'MOVING'
    AND   ms.move_date <= tr2.need_to_ship_by_date
    GROUP BY tmi.request_id

и посмотрите переписать с EXISTS. У меня есть общее правило, что таблица не должна быть в списке ОТ, если столбец фактически НЕ ВЫБРАН.

Присоединение к tr2 - есть ли у вас запросы в manifest_items, а не в таблице запросов?

SELECT tmi.request_id,
      SUM(tmi.quantity) qty_palletized_on_time
FROM  manifest_items tmi
WHERE exists
  (SELECT 1
    FROM  outbd_containers toc
    JOIN  containers c ON c.scannable_id = toc.scannable_id
    JOIN  move_segments ms ON c.container_id = ms.move_to_container_id
    WHERE toc.manifest_id = tmi.manifest_id
    AND   ms.action = 'MOVING'
    AND   ms.move_date <= tr2.need_to_ship_by_date)
 GROUP BY tmi.request_id
1 голос
/ 30 июля 2011

Самый простой способ, если вы используете Oracle, - это преобразовать тот SQL-файл, который вы часто используете, в материализованное представление. В приведенном ниже примере у вас есть материализованное представление, основанное на вашем первом sql, созданное с помощью быстрого обновления.

CREATE MATERIALIZED VIEW aggregated_requests
   BUILD IMMEDIATE
   REFRESH FAST ON COMMIT
   AS 
SELECT
      request_id,
      SUM(quantity_requested) qty_requested,
      SUM(quantity_cancelled) qty_cancelled
    FROM
      request_items
    GROUP BY request_id;

И тогда у вас есть физическая таблица вместо запроса.

Проверьте это: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6002.htm

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