- UNION, MINUS, INTERSECT;
- FULL OUTER JOIN.
Создадим таблицы, заполним их данными:
CREATE TABLE KK_STUD_2010(ID INTEGER, NAME VARCHAR2(30));
CREATE TABLE KK_STUD_2012(ID INTEGER, NAME VARCHAR2(30));
INSERT INTO KK_STUD_2010(ID, NAME) VALUES(2,'ТРУНОВ');
INSERT INTO KK_STUD_2010(ID, NAME) VALUES(3,'ДРОНОВ');
INSERT INTO KK_STUD_2010(ID, NAME) VALUES(4,'ШТАНОВ');
INSERT INTO KK_STUD_2012(ID, NAME) VALUES(1,'ИВАНОВ');
INSERT INTO KK_STUD_2012(ID, NAME) VALUES(2,'ТРУНОВ');
INSERT INTO KK_STUD_2012(ID, NAME) VALUES(3,'ДРОНОВ');
Первое решение:
(
SELECT ID, NAME, 'Y' AS WAS_IN_2010, 'N' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2010
MINUS
SELECT ID, NAME, 'Y' AS WAS_IN_2010, 'N' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2012
)
UNION
(
SELECT ID, NAME, 'Y' AS WAS_IN_2010, 'Y' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2010
INTERSECT
SELECT ID, NAME, 'Y' AS WAS_IN_2010, 'Y' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2012
)
UNION
(
SELECT ID, NAME, 'N' AS WAS_IN_2010, 'Y' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2012
MINUS
SELECT ID, NAME, 'N' AS WAS_IN_2010, 'Y' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2010
);
Второе решение:
SELECT NVL(KK_STUD_2010.ID, KK_STUD_2012.ID) ID,
NVL(KK_STUD_2010.NAME, KK_STUD_2012.NAME) NAME,
DECODE(KK_STUD_2010.ID, NULL, 'N', 'Y') AS WAS_STUDENT_IN_2010,
DECODE(KK_STUD_2012.ID, NULL, 'N', 'Y') AS WAS_STUDENT_IN_2012
FROM KK_STUD_2010
FULL OUTER JOIN KK_STUD_2012
ON KK_STUD_2010.ID = KK_STUD_2012.ID;
Второе решение быстрее, т.к. не сканирует таблицы несколько раз. Кроме того, второе решение демонстрирует эффективный способ выявления дельты (порции изменившихся данных) между двумя загрузками.
Задача. Загрузка данных с помощью full join.