Łączenie tabel w MS SQL JOIN, UNION, EXCEPT.

W tej części kursu zajmiemy się łączeniem tabel. Oto najprostszy przykład oparty o INNER JOIN:
SELECT
SELECT 
a.ilosc,
a.koszt,
b.name,
c.name

FROM
[dbo].[sprzedarz] a 
JOIN [dbo].[produkty] b on b.Id = a.[Produktid]
INNER JOIN [dbo].[miasta] c on c.Id = a.[Miastatid]
go

Powyższy przykład pokazuje jak w SQL SERVER możemy połączyć trzy tabele. Specjalnie użyłem w przykładnie JOIN oraz INNER JOIN by wskazać, że działają w ten sam sposób. Po polceniu ON podajemy waruneki łączenia. Możemy tak jak w przepadku WHERE łączyć kilka warunków ze sobą.



SELECT 
c.name

FROM
[dbo].[sprzedarz] a 
INNER JOIN [dbo].[miasta] c on c.Id = a.[Miastatid]


SELECT 
c.name

FROM
[dbo].[sprzedarz] a 
LEFT JOIN [dbo].[miasta] c on c.Id = a.[Miastatid]

go

Powyżej mam dwa zapytania pierwsze oparte o INNER JOIN oraz drugie LEFT JOIN. Drugie zapytanie zwraca jeden wiersz więcej!? Jest to efekt działania left join, który wyświetla nam wszystkie dane z tabeli sprzedarz i tylko te miasta, które spełniają warunek łączenia.



SELECT distinct
a.[Miastatid],c.name

FROM
[dbo].[sprzedarz] a 
RIGHT JOIN [dbo].[miasta] c on c.Id = a.[Miastatid]


SELECT distinct
a.[Miastatid],c.name

FROM
[dbo].[sprzedarz] a 
LEFT JOIN [dbo].[miasta] c on c.Id = a.[Miastatid]

Kolejnym z zewnętrznych złączeń jest RIGHT JOIN działający jak left jednak zwraca wszyskie dane z tabeli znajdującej się z prawej strony.


SELECT distinct
a.[Miastatid],c.name

FROM
[dbo].[sprzedarz] a 
FULL JOIN [dbo].[miasta] c on c.Id = a.[Miastatid]



Polecenie FULL JOIN pozwala wybrać wszystkie wartości z pierwszej i drugiej tabeli, nawet te które nie spełniają warunku c.Id = a.[Miastatid].
SELECT distinct
a.[Miastatid],c.name

FROM
[dbo].[sprzedarz] a 
RIGHT JOIN [dbo].[miasta] c on c.Id = a.[Miastatid]
WHERE
a.[Miastatid] is null

Używjąc WHERE oraz RIGHT JOIN możemy łatwo wybrać np miasta z, którego nigdy nie było zamówienia.

SELECT distinct
a.[Miastatid],c.name

FROM
[dbo].[sprzedarz] a, [dbo].[miasta] c
WHERE
c.Id = a.[Miastatid]

SELECT distinct
a.[Miastatid],c.name

FROM
[dbo].[sprzedarz] a cross join [dbo].[miasta] c
WHERE
c.Id = a.[Miastatid]

Możemy również użyć CROSS JOIN w, którym waruneki łączenia podajemy w kaluzuli where. Bez zastosowanie WHERE uzyskamy iloczyn kartezjański.


Wskazówka! Podczas łączenia pamiętać należy o łączeniu po kolumnach, które posiadają indeksy, pozwala to na znaczne przyśpieszenie wykonywania zapytania.

Użycie UNION w MS SQL

Innym sposobem łączenie np dwóch tabel jest UNION, EXCEPT, INTERSECT. Są to operacje na zbiorach.
select *
from
miasta
UNION 
select *
from
produkty

Union pozwala na połączenia dwóch tabel, ale tak jakby przez ich "sklejenie". Wymaga by dwa zapytania miały tą samą ilość kolumn oraz typy danych.

select *
from
miasta
UNION 
select *
from
miasta
go
select *
from
miasta
UNION ALL
select *
from
miasta

UNION w tym przpadku jak łatwo zauważyć eliminuje duplikaty, podczas gdy UNION ALL nie.


Użycie EXCEPT w MS SQL


select *
from
miasta
EXCEPT 
select *
from
miasta
where
name like 'W%'



Przeciwieństwem EXCEPT jest INTERSECT w t-sql wybiera wspólne elementy ze zbioru danych czyli wybierze te rekordy które są takie same.
select *
from
miasta
INTERSECT 
select *
from
miasta
where
name like 'W%'



Odwrotnie działa Except pozwala na wykluczenie w zapytaniu SQL. Wynikiem tego zapytania będzie pierwsza tabla z wykluczenie tych rekordów które zawiera druga.  

SQL-KURSY.pl poleca:

Książki
ksikaksikaksikaksikaksika

Copyright 2010-2011mariuszhk@op.pl

obob ob

Valid HTML 4.01 Transitional

Strona internetowa wykorzystuje pliki cookie zapisywane w pamięci przeglądarki internetowej.

OK