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)