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

 OrderId     Orderdate     Firstname Lastname
 ... ... ... ...


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


 OrderId Orderdate     CustomerId CompanyName
 ... ... ... ...



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:

 Kodi Porosise Data Porosise
 Klienti Punonjesi Vlera e porosise
 123 1/1/2000 Kompania 1
 emer mbiemri
 


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)