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

Таблицы имеют одинаковые поля номер, дата, значение1(float), значение2(float).
Номер и дата в паре могут дублироваться, но иметь при этом разные значения.
Количество строк в таблицах также могут отличаться.
Цель максимально точно сравнить значения таблиц и вывести отличающиеся, но при этом если номер, дата и какое то одно значение совпадает, а второе нет, они должны быть выведены в одной строке.
Перебрал различные вариации джойнов, толкового решения не нашлось.
Есть какие нибудь идеи?
  • Вопрос задан
  • 5684 просмотра
Решения вопроса 1
igruschkafox
@igruschkafox
Специалист по сопровождению БД MS SQL
-- Создали таблицы
CREATE TABLE table1 (Numer INT,Data DATETIME , value1 FLOAT,value2 FLOAT)
CREATE TABLE table2 (Numer INT,Data DATETIME , value1 FLOAT,value2 FLOAT)

go
-- Очищаем таблицы
TRUNCATE TABLE table1
TRUNCATE TABLE table2

-- Заполняем данным
INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 1, '01.01.2015', 1.1, 1.2  ) -- только в первой таблице
INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 1, '01.01.2015', 1.2, 1.2  )
INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 2, '01.01.2014', 2.1, 2.2  )
INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 5, '01.01.2014', 3.1, 1.2  )
INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 4, '01.01.2015', 1.1, 4.2  )

-- Заполняем данным
INSERT INTO dbo.table2 ( Numer, Data, value1, value2 ) VALUES  ( 1, '01.01.2015', 1.2, 1.2  )
INSERT INTO dbo.table2 ( Numer, Data, value1, value2 ) VALUES  ( 2, '01.01.2014', 2.1, 2.2  )
INSERT INTO dbo.table2 ( Numer, Data, value1, value2 ) VALUES  ( 3, '01.01.2014', 5.1, 1.2  ) -- Искажение в первом значении
INSERT INTO dbo.table2 ( Numer, Data, value1, value2 ) VALUES  ( 4, '01.01.2015', 1.1, 4.3  ) -- Искажение в втором значении

go
SELECT 'Нет совпадения по номеру и дате'
,
* FROM dbo.table1 t1
FULL JOIN dbo.table2 t2
ON t2.Data = t1.Data AND t2.Numer = t1.Numer 
WHERE t2.Numer IS NULL OR t1. Numer IS NULL

UNION ALL

SELECT 'Нет совпадения по первому значению'
, * FROM dbo.table1 t1
JOIN dbo.table2 t2
ON t2.Data = t1.Data AND t2.Numer = t1.Numer 
AND t2.value2 = t1.value2
where t2.value1 <> t1.value1

UNION ALL

SELECT 'Нет совпадения по второму значению'
, * FROM dbo.table1 t1
 JOIN dbo.table2 t2
ON t2.Data = t1.Data AND t2.Numer = t1.Numer 
AND t2.value1 = t1.value1
where t2.value2 <> t1.value2
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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