база данных - метод сравнения 2-х таблиц без ключей - PullRequest
1 голос
/ 06 октября 2011

Я пытаюсь понять, как сравнивать две таблицы без ключей (т. Е. Ни один столбец не является первичным ключом или уникальным) таблиц, которые должны иметь одинаковые данные.Т.е. прямая миграция таблицы из my_schema1 в my_schema2.

Я думал, что возможный метод будет:

IF 
    count from 
    ((select * from my_schema1.tablea
    union
    select * from my_schema2.tablea))
    =
    count from
    ((select * from my_schema1.tablea
    union all
    select * from my_schema2.tablea) / 2)
 THEN
     --both tables would be identical (in record counts and all column values the same)
 ELSE
     --this means that the 2 tables are different in some way
 END IF

Приятно иметь функцию: я бы предпочел сделать решение столь же универсальным, каквозможно, исключая необходимость указывать столбцы.

Ответы [ 3 ]

0 голосов
/ 06 октября 2011

Если у вас нет дубликатов, вы можете сделать это ...

SELECT
  (SELECT COUNT(*) FROM (SELECT * FROM table1 UNION SELECT * FROM table2)) AS unioned,
  (SELECT COUNT(*) FROM table1)                                            AS table1,
  (SELECT COUNT(*) FROM table2)                                            AS table2

Все три цифры должны совпадать, если две таблицы совпадают.


Тот же подход можно использовать, если есть дубликаты, добавив поле подсчета ...

WITH
  table1 AS (SELECT a, b, c, d, COUNT(*) AS duplicates FROM table1 GROUP BY a, b, c, d),
  table2 AS (SELECT a, b, c, d, COUNT(*) AS duplicates FROM table2 GROUP BY a, b, c, d)
SELECT
  (SELECT COUNT(*) FROM (SELECT * FROM table1 UNION SELECT * FROM table2)) AS unioned,
  (SELECT COUNT(*) FROM table1)                                            AS table1,
  (SELECT COUNT(*) FROM table2)                                            AS table2
0 голосов
/ 06 октября 2011

Предполагая один столбец C ниже. Вам нужно будет расширить это до полного списка столбцов (не тестировался в Oracle, поэтому могут быть некоторые незначительные синтаксические проблемы, но общий подход должен работать)

WITH T1 AS
(
SELECT *,
       ROW_NUMBER() OVER (PARTITION BY C ORDER BY C) AS RN
FROM T              
), T2 AS
(
SELECT *,
       ROW_NUMBER() OVER (PARTITION BY C ORDER BY C) AS RN
FROM T       
), T3 AS
(
SELECT * FROM T1 
MINUS
SELECT * FROM T2
), T4 AS
(
SELECT * FROM T2 
MINUS
SELECT * FROM T1
)
SELECT * FROM T3
UNION ALL 
SELECT * FROM T4
0 голосов
/ 06 октября 2011
select count(*) 
from 
(
 ( select * from my_schema1.tablea 
   minus 
   select * from my_schema2.tablea
 )
 union 
 ( select * from my_schema2.tablea 
   minus 
   select * from my_schema1.tablea
 )
)

if count(*) = 0 then 
 THEN
     --both tables are identical 
 ELSE
     -- the 2 tables are different in some way
 end if;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...