Chapter 03 - Displaying data form multiple tables
Joins
Per te marre te dhena nga disa tabela perdoret JOIN. Kemi disa lloje te JOIN:
CROSS JOIN
INNER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
SELF JOIN
NON EQUI JOIN
Cross Join ( Prodhimi kartezian)
Cfare kthen komanda e meposhtme:
select p.ProductID,p.ProductName,p.CategoryID,
c.CategoryID,c.CategoryName
from products p cross join Categories c
order by p.ProductID
Cfare kuptimi ka ky rezultat ?
Inner Join
Kthen te gjithe rreshtat e tabeles ne te majte te veprimit te Join per te cilet ka nje korrespondence ne tabelen e djathte te veprimit te JOIN si edhe te gjithe rreshtat e tabeles se djathte per te cilat ka nje korrespondence ne tabelen e majte.
INNER JOIN nuk kthen rreshtat e tabeles ne te majte te JOIN per te cilat nuk ka korrespondence ne tabelen e djathte dhe nuk kthen rreshtat e tabeles ne te djathte per te cilet nuk ka korrespondence ne tabelen e majte.
Per shembull
SELECT Products.ProductID,
Products.ProductName,Categories.CategoryID,Categories.CategoryName from
Categories INNER JOIN Products
ON Categories.CategoryID=Products.CategoryID
where Categories.CategoryId>6
Shenim: Per arsye te permasave te afishimit po perqendrohemi tek kategorite > 6 (where Categories.CategoryId>6)
Afishon te gjithe produktet dhe kategorite qe jane korrespondence me njeri tjetrin.
Nuk afishon kategori per te cilat nuk ka produkte
Nuk afishon produkte per te cilat nuk ka kategori
Me poshte paraqitet rezultati i afishimit te komanded se mesiperme INNER JOIN
Vini re qe ne tabelen kategorite eshte shtuar se fundmi nje kategori me emrin kategori bosh, me CategoryId= 9 per te cilen nuk ka produkte.
Kjo kategory nu afishohet ne rezultatin e INNER JOIN pe arsye se kjo kategori nuk ka produkte, pra nuk ka referenca nga rreshtat e tabekes qe ndodhet ne te djathte te JOIN (Products) tek kjo kategori. Kjo eshte arsyeja qe INNER JOIN nuk e perfshin kete kategori ne rezultatin final.
INNER JOIN eshte menyra baze (default) si funksionojne JOIN.
Outer Join
Left Outer Join
Ne disa raste eshte e nevojshme te afishojme pervec rreshtave qe kane korrespondence ne te dy anet e e JOIN edhe rreshtat ne tabelen e majte per te cilat nuk ka korrespondence ne tabelen e djathte.
Keshtu nese duam te afishojme te gjithe kategorite qe kane ose jo produkte si edhe te gjithe produktet e ketyre kategorive do te perdornimi JOIN por kesaj rradhe me LEFT OUTER , duke vendosur tabelen Categories ne te majte te veprimit JOIN
SELECT Products.ProductID,
Products.ProductName,Categories.CategoryID,Categories.CategoryName from
Categories LEFT OUTER JOIN Products
ON Categories.CategoryID=Products.CategoryID
where categories.CategoryID>6
Do te afishonte:
Pra LEFT OUTER JOIN , ne kete rast me Categories ne te majte dhe Products ne te djathte :
afishon te gjithe produktet dhe kategorite qe kane korrespondence direkte midis tyre
afishon te gjithe kategorite pavaresishte nese kane apo jo produkte (kategoria 9,kategoribosh)
nuk afishon produktet qe nuk kane kategori
RIGHT OUTER JOIN
Eshte i ngjashem me LEFT OUTER JOIN vetem se vepron ne te djathte te veprimit te JOIN.
Nese do te donim te merrnim rezultatin e mesiperm me RIGHT OUTER JOIN thjeshte do te ndryshonim vendosjen e tabelave ne te majte dhe te djathte te veprimit JOIN. Vini re query e meposhtem dhe vereni dallimin me query e mesiperm me LEFT OUTER
SELECT Products.ProductID,
Products.ProductName,Categories.CategoryID,Categories.CategoryName from
Products RIGHT OUTER JOIN Categories
ON Categories.CategoryID=Products.CategoryID
where categories.CategoryID>6
Rezultati eshte identik me rezultatin e query te meparshem
Full Outer Join
Eshte i ngjashem me rastet e meparshme por vepron edhe ne te majte edhe ne te djathte te veprimit JOIN.
Prandaj komanda:
SELECT Products.ProductID,
Products.ProductName,Categories.CategoryID,Categories.CategoryName from
Categories FULL OUTER JOIN Products
ON Categories.CategoryID=Products.CategoryID
afishon te gjithe produktet dhe kategorite per te cilat ka korrespondence
afishon kategorite per te cilat nuk ka produkte
afishon produktet qe nuk jane te kategorizuar
Self Join
Cfare afishon komanda me poshte:
select e1.EmployeeID,e1.FirstName,e1.LastName,e1.ReportsTo,
e2.EmployeeID,e2.FirstName,e2.LastName
from Employees e1 join Employees e2
on e1.EmployeeID=e2.ReportsTo
order by e1.EmployeeID
Ushtrime
Ushtrim 1
te afishojme kodin e porosise, daten,kodin dhe emrin e punonjesit qe e trajtoi ate porosi
Zgjidhje
SELECT Orders.OrderID,Orders.OrderDate,Orders.EmployeeID,
Employees.FirstName,Employees.LastName
FROM Orders INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID
Ushtrim 2
Te afishojme kodin e porosise, daten, kodin e klientit
dhe emrin e kompanise klient per cdo porosi
Zgjidhje
SELECT Orders.OrderID,Orders.OrderDate,Orders.CustomerID,
Customers.CompanyName
FROM Orders INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID
Ushtrim 3
Te afishojme kodin e produktit,emrin e produktit
dhe emrin e kompanise furnitore per kete produkt
ProductId
...
ProductName
..
SupplierName
...
Zgjidhje
SELECT Products.ProductID,Products.ProductName,Suppliers.CompanyName
FROM Products INNER JOIN Suppliers
ON Products.SupplierID=Suppliers.SupplierID
Ushtrim 4
Te afishojme librin e shitjeve te kompanise, si ne formatin me poshte:
Zgjidhje
select o.OrderID as [Kodi i Porosise],
o.OrderDate as [Data e Porosise],
c.CompanyName as [Klienti],
(e.FirstName+' '+e.LastName) as [Punonjesi] ,
SUM(od.UnitPrice*od.Quantity) as [Vlera e porosise]
from Customers c join orders o
on c.CustomerID=o.CustomerID
join Employees e
on e.EmployeeID=o.EmployeeID
join [Order Details] od
on od.OrderID=o.OrderID
group by o.OrderID,o.OrderDate,c.CompanyName,
(e.FirstName+' '+e.LastName)