У меня есть потребность проверить живую таблицу по транзакционной архивной таблице, и я не уверен в самом быстром способе сделать это...
Например, скажем, моя живая таблица составлена из этих столбцов:
Моя архивная таблица имела бы те же столбцы, но также и имела бы дату архива, таким образом, я вижу то, что оценивает живую таблицу, имел в данную дату.
Теперь... Как я записал бы запрос, чтобы гарантировать, что значения для живой таблицы совпадают с новыми записями в архивной таблице?
PS я предпочел бы обрабатывать это в SQL, но МН / SQL также опция, если это быстрее.
SELECT term, crn, fee, level_code
FROM live_data
MINUS
SELECT term, crn, fee, level_code
FROM historical_data
Что в прямом эфире, но не в историческом. Затем можно объединиться в обратную сторону, чтобы получить историческое, но не живое.
Вы не упомянули, как уникально идентифицируются строки, поэтому я предположил, что у вас также есть столбец "id":
SELECT *
FROM livetable
WHERE (term, crn, fee, levelcode) NOT IN (
SELECT FIRST_VALUE(term) OVER (ORDER BY archivedate DESC)
,FIRST_VALUE(crn) OVER (ORDER BY archivedate DESC)
,FIRST_VALUE(fee) OVER (ORDER BY archivedate DESC)
,FIRST_VALUE(levelcode) OVER (ORDER BY archivedate DESC)
FROM archivetable
WHERE livetable.id = archivetable.id
);
Примечание: Этот запрос не учитывает NULLS - если какой-либо из столбцов является нулевым, вы можете добавить соответствующую логику (например, NVL каждого столбца в некоторое "невозможное" значение).
выгрузить в table.unl выбрать * from table1 заказать 1,2,3,4
выгрузить в table2.unl select * from table2 order by 1,2,3,4
diff table1.unl table2.unl> diff.unl
Не могли бы вы использовать запрос формы:
SELECT your columns FROM your live table
EXCEPT
SELECT your columns FROM your archive table WHERE archive date is most recent;
Любыми результатами будут строки в вашей живой таблице, которых нет в вашем последнем архиве.
Если вам также нужны строки в вашем последнем архиве, которых нет в вашей живой таблице, просто измените порядок выборок и повторите, или получите их все в том же запросе, выполнив (живой архив UNION ) ИСКЛЮЧАЯ (живой архив ПЕРЕСЕЧЕНИЯ)
Просто:
SELECT collist
FROM TABLE A
minus
SELECT collist
FROM TABLE B
UNION ALL
SELECT collist
FROM TABLE B
minus
SELECT collist
FROM TABLE A;