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

    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
    Ответ написан
    3 комментария