Как мне объединить несколько таблиц?(У первого есть данные за этот месяц, у второго есть все другие предыдущие данные) - PullRequest
0 голосов
/ 23 сентября 2019

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

Вотвопрос.Мы недавно создали резервную копию или историю транзакций на другую таблицу для всего, что старше 30 дней.

Итак, у меня есть таблицаaction_history, которая дает мне все с сегодняшнего дня до 30 дней назад, и у меня есть таблица AR_transaction_history, которая даетмне все остальное (начиная с 31 дня назад.)

Мне нужно иметь возможность создавать подсказки для пользователя, чтобы ввести либо идентификатор контейнера, номер отслеживания, либо идентификатор доставки.

Мне нужна помощь в объединении двух таблиц для создания 1 таблицы со всеми записями.Я попытался объединить все, и он не работает с моими подсказками.Я попробовал заявление isnull, и это тоже не сработало.Вот код.

select 
  th.reference_id,
  th.container_id 'Container ID', 
  sc.tracking_number 'Tracking Number',
  max(th.DATE_TIME_STAMP) 'Time of Last Touch', 
  CASE
    WHEN th1.date_time_stamp = max(th.DATE_TIME_STAMP) then th1.user_name
  END AS 'User Name',
  CASE
    WHEN th1.date_time_stamp = max(th.DATE_TIME_STAMP) then th1.location
  END AS 'Location'
from TRANSACTION_HISTORY th
inner join TRANSACTION_HISTORY th1 on th1.CONTAINER_ID = th.CONTAINER_ID
inner join SHIPPING_CONTAINER sc on sc.CONTAINER_ID = th.CONTAINER_ID
group by th.container_id, sc.tracking_number, th1.DATE_TIME_STAMP, th1.USER_NAME, th1.LOCATION, th.REFERENCE_ID
Having
  CASE
    WHEN th1.date_time_stamp = max(th.DATE_TIME_STAMP) then th1.user_name
  END is not null

UNION ALL

select 
  th.reference_id,
  th.container_id 'Container ID',
  sc.tracking_number 'Tracking Number',
  max(th.DATE_TIME_STAMP) 'Time of Last Touch', 
  CASE
    WHEN th1.date_time_stamp = max(th.DATE_TIME_STAMP) then th1.user_name
  END AS 'User Name',
  CASE
    WHEN th1.date_time_stamp = max(th.DATE_TIME_STAMP) then th1.location
  END AS 'Location'
from AR_TRANSACTION_HISTORY th
inner join AR_TRANSACTION_HISTORY th1 on th1.CONTAINER_ID = th.CONTAINER_ID
inner join AR_SHIPPING_CONTAINER sc on sc.CONTAINER_ID = th.CONTAINER_ID
group by th.container_id, sc.tracking_number, th1.DATE_TIME_STAMP, th1.USER_NAME, th1.LOCATION, th.REFERENCE_ID
Having
  CASE
    WHEN th1.date_time_stamp = max(th.DATE_TIME_STAMP) then th1.user_name
  END is not null

1 Ответ

0 голосов
/ 23 сентября 2019

Выполните UNION ALL в подзапросе и оставьте оставшуюся часть исходного запроса без изменений.Это самый простой способ продолжить, не рассматривая всю логику вашего (агрегированного) запроса.

SELECT
....
FROM
    (
        SELECT * FROM TRANSACTION_HISTORY
        UNION ALL SELECT * FROM AR_TRANSACTION_HISTORY
    ) as th
    INNER JOIN SHIPPING_CONTAINER sc on sc.CONTAINER_ID = th.CONTAINER_ID
GROUP BY ...

Примечание: в общем, SELECT * и UNION ALL не ладят.В этом ответе предполагается, что таблицы TRANSACTION_HISTORY и AR_TRANSACTION_HISTORY имеют одинаковую структуру (столбцы и типы данных).

...