Самый быстрый способ определить различия между двумя таблицами?

У меня есть потребность проверить живую таблицу по транзакционной архивной таблице, и я не уверен в самом быстром способе сделать это...

Например, скажем, моя живая таблица составлена из этих столбцов:

  • Термин
  • CRN
  • Сбор
  • Код уровня

Моя архивная таблица имела бы те же столбцы, но также и имела бы дату архива, таким образом, я вижу то, что оценивает живую таблицу, имел в данную дату.

Теперь... Как я записал бы запрос, чтобы гарантировать, что значения для живой таблицы совпадают с новыми записями в архивной таблице?

PS я предпочел бы обрабатывать это в SQL, но МН / SQL также опция, если это быстрее.

6
задан wonea 16 January 2013 в 12:05
поделиться

5 ответов

SELECT term, crn, fee, level_code
FROM live_data
MINUS
SELECT term, crn, fee, level_code
FROM historical_data

Что в прямом эфире, но не в историческом. Затем можно объединиться в обратную сторону, чтобы получить историческое, но не живое.

11
ответ дан 8 December 2019 в 17:21
поделиться

Вы не упомянули, как уникально идентифицируются строки, поэтому я предположил, что у вас также есть столбец "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 каждого столбца в некоторое "невозможное" значение).

1
ответ дан 8 December 2019 в 17:21
поделиться

выгрузить в 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

0
ответ дан 8 December 2019 в 17:21
поделиться

Не могли бы вы использовать запрос формы:

SELECT your columns FROM your live table
EXCEPT
SELECT your columns FROM your archive table WHERE archive date is most recent;

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

Если вам также нужны строки в вашем последнем архиве, которых нет в вашей живой таблице, просто измените порядок выборок и повторите, или получите их все в том же запросе, выполнив (живой архив UNION ) ИСКЛЮЧАЯ (живой архив ПЕРЕСЕЧЕНИЯ)

0
ответ дан 8 December 2019 в 17:21
поделиться

Просто:

SELECT collist
  FROM TABLE A
minus 
SELECT collist
  FROM TABLE B
UNION ALL
SELECT collist
  FROM TABLE B
minus 
SELECT collist
  FROM TABLE A;
2
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: