Setup Step 1
CREATE TABLE emp2 AS
SELECT *
FROM scott.emp
Table created.
Setup Step 2
CREATE TABLE emp AS
SELECT *
FROM scott.emp
Table created.
Modify some records
UPDATE emp2
SET ename='SMITE'
WHERE empno=7369
1 row(s) updated.
UPDATE emp2
SET job='SALESGUY'
WHERE empno=7499
1 row(s) updated.
UPDATE emp2
SET mgr=7788
WHERE empno=7521
1 row(s) updated.
UPDATE emp2
SET sal=1750
WHERE empno=7654
1 row(s) updated.
UPDATE emp2
SET comm=1000
WHERE empno=7698
1 row(s) updated.
DELETE FROM emp2
WHERE empno=7902
1 row(s) deleted.
DELETE FROM emp
WHERE empno=7788
1 row(s) deleted.
Show the differences
WITH x AS (
SELECT empno, ename, job, mgr, sal, comm, 'EMP' tbl
FROM emp
UNION ALL
SELECT empno, ename, job, mgr, sal, comm, 'EMP2' tbl
FROM emp2
)
SELECT empno, MAX(tbl) tbl,
CASE WHEN COUNT(DISTINCT ename) OVER(PARTITION BY empno)=COUNT(ename) OVER(PARTITION BY empno)
THEN ename
END ename,
CASE WHEN COUNT(DISTINCT job) OVER(PARTITION BY empno)=COUNT(job) OVER(PARTITION BY empno)
THEN job
END job,
CASE WHEN COUNT(DISTINCT mgr) OVER(PARTITION BY empno)=COUNT(mgr) OVER(PARTITION BY empno)
THEN mgr
END mgr,
CASE WHEN COUNT(DISTINCT sal) OVER(PARTITION BY empno)=COUNT(sal) OVER(PARTITION BY empno)
THEN sal
END sal,
CASE WHEN COUNT(DISTINCT comm) OVER(PARTITION BY empno)=COUNT(comm) OVER(PARTITION BY empno)
THEN comm
END comm
FROM x
GROUP BY empno, ename, job, mgr, sal, comm
HAVING COUNT(*)=1
ORDER BY 1, 2
EMPNO | TBL | ROW_CNT | ENAME | JOB | MGR | SAL | COMM | 7369 | EMP | 2 | SMITH | - | - | - | - | 7369 | EMP2 | 2 | SMITE | - | - | - | - | 7499 | EMP | 2 | - | SALESMAN | - | - | - | 7499 | EMP2 | 2 | - | SALESGUY | - | - | - | 7521 | EMP | 2 | - | - | 7698 | - | - | 7521 | EMP2 | 2 | - | - | 7788 | - | - | 7654 | EMP | 2 | - | - | - | 1250 | - | 7654 | EMP2 | 2 | - | - | - | 1750 | - | 7698 | EMP | 2 | - | - | - | - | - | 7698 | EMP2 | 2 | - | - | - | - | 1000 | 7788 | EMP2 | 1 | SCOTT | ANALYST | 7566 | 3000 | - | 7902 | EMP | 1 | FORD | ANALYST | 7566 | 3000 | - |
---|