SQL: Operacje na zbiorach ( UNION, UNION ALL, MINUS, INTERSECT )
Zapytanie SQL zwraca zbiór rekordów. Oracle SQL pozwala na podstawowe operacje na zbiorach.
UNION ALL
Jesli zapytania połaczymy operatorem UNION ALL to zwracany jest zbiór rekrdów będący sumą rekordów z poszczególnych zapytań:
select 1 as col from dual
union all
select 2 from dual
COL
----------
1
2
Jeśli rekordy występują w wielu zapytaniach to będą powtarzać się w wyniku:
select 1 as col from dual
union all
select 1 from dual
/
COL
----------
1
1
Na ratunek przy chodzi operator:
UNION
Operator UNION zwraca unikalne rekordy z zapytań połączonch.
select 1 as col from dual
union
select 1 from dual
/
COL
----------
1
I mamy tylko 1 rekord, bo jest taki sam w pierwszym i drugim zapytaniu.
MINUS
Operator MINUS zwraca różnicę zbiorów
select 1 as col from dual
minus
select 1 from dual
/
nie wybrano żadnych wierszy
Nic! Brak rekordów istniejących w pierwszym zapytaniu, a nie istniejących w drugim.
select 1 as col from dual
minus
select 2 from dual
/
COL
----------
1
Jeden rekord jest zwracany. Należy podkreślić, że rekordy z drugiego zapytania nie są zwracane.
INTERSECT
I ostatni operator to INTERSECT
Zwraca on część wspólną zbiorów. Rekordy istniejące w jednym i drugim zapytaniu:
select 1 as col from dual
intersect
select 2 from dual
/
nie wybrano żadnych wierszy
Nic! Zapytania nie zawierają elementów wspólnych.
Uwaga! Operatory UNION, MINUS i INTERSECT zwracają unikalne rekordy. Oznacza to, że ich wykonanie wymaga kosztownej operacji sortowania.
Operator UNION ALL nie sortuje rekordów. Zatem, jeśli jest to możliwe, należy używac operatora UNION ALL zamiast UNION.