Разница в двух таблицах отображает разницу в строках в одном столбце - PullRequest
0 голосов
/ 10 октября 2018

У меня есть две таблицы, которые возвращают 3 столбца (№ счета, Сумма, Номер сайта)

Образец: Таблица № 1

111111, 200, 14
111111,-200, 14
111111, 400, 15
111111, -400, 15

Таблица № 2

111111, 201, 14
111111,-200, 14
111111, 400, 15
111111, -400, 15

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

Примерно так:

Act#:   TblA Amount TblB Amount Site
111111, 200,        201,        14

Когда я использую минус, он просто возвращает мне строку в верхней таблице, которая отличается, так что если я сделал:

select * from TblA
MINUS
select * from TblB

Результат:

111111, 200, 14

Я знаю, что должен быть способ сделать это, и любая помощь будет отличной!

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Возможно, следующие запросы помогут.Принцип: найдите различия между таблицами (содержимое A минус содержимое B и наоборот), затем используйте их в объединении, чтобы «свернуть» набор результатов.Использование ваших тестовых данных (Oracle 12c):

(
  select c1, c2, c3, 'in table#1' location from table#1
  minus
  select c1, c2, c3, 'in table#1'  from table#2
)
union all
(
  select c1, c2, c3, 'in table#2 (not in table#1)' from table#2
  minus
  select c1, c2, c3, 'in table#2 (not in table#1)' from table#1
);

-- result
        C1         C2         C3 LOCATION                     
---------- ---------- ---------- ---------------------------
    111111        200         14 in table#1                 
    111111        201         14 in table#2 (not in table#1)

Если для комбинаций C1 / C3 нет дубликатов, следующий JOIN даст вам требуемый результат.(Может быть, это будет «достаточно хорошо» для вашей ситуации ...)

select 
  A.c1
--, B.c1
, A.c2
, B.c2
, A.c3
--, B.c3
from
(
  select * from table#1
  minus
  select * from table#2
) A join (
  select * from table#2
  minus
  select * from table#1
) B on A.c1 = B.c1 and A.c3 = B.c3 
;

-- result
        C1         C2         C2         C3
---------- ---------- ---------- ----------
    111111        200        201         14

Dbfiddle здесь.

0 голосов
/ 10 октября 2018

Вы можете использовать FULL JOIN:

SELECT *
FROM tabA a
FULL JOIN tabB b
  ON a.id = b.id  -- here should be PK or UNIQUE col
WHERE NOT EXISTS (SELECT a.Account, a.Amount, a.Site_Number FROM dual
                  INTERSECT
                  SELECT b.Account, b.Amount, b.Site_Number FROM dual);

db <> fiddle demo

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