Самый быстрый способ определить различия между двумя таблицами? - PullRequest
6 голосов
/ 19 февраля 2010

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

Например, допустим, моя живая таблица состоит из следующих столбцов:

  • Срок
  • CRN
  • Плата
  • Код уровня

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

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

PS Я бы предпочел обрабатывать это в SQL, но PL / SQL также возможен, если он быстрее.

Ответы [ 5 ]

11 голосов
/ 19 февраля 2010
SELECT term, crn, fee, level_code
FROM live_data
MINUS
SELECT term, crn, fee, level_code
FROM historical_data

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

2 голосов
/ 16 марта 2010

Просто:

SELECT collist
  FROM TABLE A
minus 
SELECT collist
  FROM TABLE B
UNION ALL
SELECT collist
  FROM TABLE B
minus 
SELECT collist
  FROM TABLE A;
1 голос
/ 19 февраля 2010

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

Примечание.Любой из столбцов можно обнулять, вы можете добавить подходящую логику (например, NVL каждый столбец к некоторому «невозможному» значению).

0 голосов
/ 19 февраля 2010

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

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

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

Если вам также нужны строки в вашем последнем архиве, которых нет в вашей активной таблице, просто измените порядок выбора и повторите или получайте их все в одном запросе, выполнив (live UNION archive) EXCEPT (live INTERSECTION archive)

0 голосов
/ 19 февраля 2010

выгрузить в table.unl выбрать * из таблицы1 заказать по 1,2,3,4

выгрузить в table2.unl выбрать * из таблицы2 заказать по 1,2,3,4

diff table1.unl table2.unl> diff.unl

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