В Oracle Database, UNION оператор ни позволява да комбинираме резултатите от две заявки в един набор от резултати.
Пример
Да предположим, че имаме следните таблици:
SELECT * FROM Teachers;
SELECT * FROM Students; Резултат:
| TEACHERID | TEACHERNAME |
|---|---|
| 1 | Уорън |
| 2 | Бен |
| 3 | Кати |
| 4 | Кати |
| 5 | Сметка |
| 6 | Сметка |
| УЧЕНИК | STUDENTNAME |
|---|---|
| 1 | Фей |
| 2 | Реактивен |
| 3 | Спайк |
| 4 | Ейн |
| 5 | Уорън |
| 6 | Сметка |
Ето пример за използване на UNION оператор за връщане на имената на всички учители и ученици:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students; Резултат:
| TEACHERNAME |
|---|
| Бен |
| Сметка |
| Кати |
| Ейн |
| Фей |
| Реактивен |
| Спайк |
| Уорън |
По подразбиране UNION оператор имплицитно прилага DISTINCT операция. С други думи, той връща само различни стойности по подразбиране. Така че горните резултати съдържат само по един от Уорън, Кати и Бил. Това е въпреки факта, че комбинираните таблици всъщност съдържат двама Уорън, две Кати и три Била (има двама учители, наречени Кати, учител и клиент, наречен Уорън, и двама, наречени Бил, както и един ученик, наречен Бил).
Включване на дубликати
Можем да използваме ALL ключова дума, за да включите дублиращи се стойности в резултатите:
SELECT TeacherName FROM Teachers
UNION ALL
SELECT StudentName FROM Students; Резултат:
| TEACHERNAME |
|---|
| Уорън |
| Бен |
| Кати |
| Кати |
| Сметка |
| Сметка |
| Фей |
| Реактивен |
| Спайк |
| Ейн |
| Уорън |
| Сметка |
Този път получихме дванадесет реда вместо осемте, които получихме в първия ни пример.
Можем да видим, че и двете Кати бяха върнати и трите законопроекта бяха върнати.
Някои неща, които трябва да запомните
Обърнете внимание, че изразите трябва да съвпадат по брой и трябва да са в една и съща група тип данни. Следователно не можем да направим следното:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students; Резултат:
ORA-01789: query block has incorrect number of result columns
Или това:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId FROM Students; Резултат:
ORA-01790: expression must have same datatype as corresponding expression
Въпреки това можем да използваме функции като TO_CHAR() за да преобразувате колона в подходяща група данни:
SELECT TeacherName FROM Teachers
UNION
SELECT TO_CHAR(StudentId) FROM Students; Резултат:
TEACHERNAME 1 2 3 4 5 6 Ben Bill Cathy Warren