Chapter 06 - Managing content through DML commands




Komanda INSERT

Komanda INSERT shton rreshta ne tabela. Kjo komande ka dy forma:

1) INSERT [INTO] tab_name [(col_list)]
 VALUES ({ DEFAULT | NULL | expression } [ ,...n] )

2) INSERT INTO tab_name | view_name [(col_list)]
{select_statement | execute_statement}

Forma e pare perdoret per te shtuar nje rresht me vlera ne tabele.

Forma e dyte shton ne tabele  nje bashkesi rreshtash te kthyer nga nje komande SELECT
ose nga nje "STORED PROCEDURE", e cila ekzekutohet me ane te komandes "EXECUTE".

Me te dy menyrat, cdo vlere qe ruhet duhet te kete nje tip te dhene i cili te jete kompatibel me tipin e te dhenes se kolones korresponduese te tabeles.

Ruajtja e nje rreshti te vetem

   
Ne te dy menyrat e komandes INSERT percaktimi i listes se kolonave eshte opsional. Nese lista e kollonave nuk vendoset atehere merret per baze lista e kollonave sipas struktures se tabeles. Vlerat qe duhet ti korrespondojne kollonave sipas struktures se tabeles.


Nqs nje kolone eshte e percaktuar si “IDENTITY”, vlera qe krijohet automatikisht nga sistemi do te ruhet ne kolonen perkatese. Nuk eshte e munudr qe te vendosim nje vlere ne kollonat e tipit IDENTITY nepermjet nje komande INSERT.
Nese per kollonat qe lejojne vlera NULL nuk percaktohet nje vlere atehere tek ko do te ruhet vlera NULL.

Nese vlera per nje kollone nuk eshte percaktuar ne nje komande INSERT atehere:
Nese per ate kollone ka nje vlere DEFAULT te percaktuar ne strukturen e tabeles, ne ate kollone do te ruhet vlera default. Kjo do te ndodhe pavaresishte nese kollona lejon vlera NULL apo jo.
Nese kollona nuk lejon vlera NULL dhe per te eshte percaktuar nje vlere DEFAULT komanda insert ekzekutohet pa gabime.
Nese per ate kollone nuk ka vlere DEFAULT atehere:
Nese kollona lejon vlera NULL ne kete kollone do te ruhet vlera NULL
Nese kollona nuk lejon vlera NULL atehere komanda INSERT do te deshtoje me nje mesazh gabimi

Shembujt me poshte ilustrojne perdorimin e komandes INSERT

Per shembull

INSERT INTO Employees(FirstName,LastName) 

values ('John','Smith')

Komanda me lart shton ne tabelen Employees punonjesin John Smith. Ne te gjitha kollonat e tjera qe nuk permenden ne komande vendoset vlera NULL.

Nese per kollonen HireDate percaktojme nje vlere DEFAULT te barabarte me getdate(), i cili eshte nje funksion i SQL qe kthen kohen e momentit atehere komanda: 

INSERT INTO Employees(FirstName,LastName,HireDate) 

values ('John','Smith',DEFAULT)

 si edhe komanda:

INSERT INTO Employees(FirstName,LastName) 

values ('John','Smith')

Do te shtojne nje punonjes me emrin John Smith qe merret ne pune ne castin e shtimit te rreshtit ne tabele.

Ndersa komandat me poshte jana gabim nga ana sintaksore ndaj do te deshtonin me nje mesazh gabimi.

INSERT INTO Employees(FirstName,LastName,HireDate) 

values ('John','Smith',)

INSERT INTO Employees(FirstName,LastName,HireDate) 

values ('John','Smith')


“Table Value Constructors” dhe INSERT

 Me SQL Server 2008 Microsoft ka shtuar nje funksionalitet te ri te quajtur “table value constructor”, e cila ju lejon te vendosni disa rreshta ne nje DML.

Shembulli me  poshte tregon se si mund te shtohen disa  rreshta duke perdorur konstruktoret e komandes INSERT.


INSERT INTO Employees(FirstName,Lastname,Title) 

VALUES  ('Marie', 'Meielleur', 'Sales Account Manager'),

('Marie-Pierre', 'Dubost', 'Sales manager'),

('Mariel', 'Montmatre', 'Marteking Specialist')

 

Komanda insert ne shembullin e mesiperm  3 rreshta ne te njejten kohe ne tabelen Employees.

Numri maksimal i rreshtave qe mund te shtohen me kete menyre eshte 1000.

Perdorimi i konstruktorit te vlerave te tabeles per te shtuar disa rreshta ne tabele nepermjet nje komande INSERT ndryshon funksionalisht nga perdorimi i disa komandave INSERT per te shtuar te njejtat rreshta ne tabele.  Ne rastin e perdorimit te konstruktorit te vlerave te tabeles shtimi i rreshtave eshte nje instruksion (nje transksion ne fakt) ndersa disa komanda insert jane disa instruksione ( transaksione te pavarura ne AUTOCOMMIT mode).

Per te kuptuar dallimin do te perdorim nje shembull. Do te shtojme tre punonjes ne tabelen punonjesit duke perdorur te dy menyrat. 

Menyra e pare - Shtimi i rreshtave duke perdorur konstruktorin e vlerave te tabeles

Nese  ekzekutojme komanden e meposhtme:

INSERT INTO Employees(FirstName,Lastname,Title) 

VALUES   (NULL, 'Meielleur', 'Sales Account Manager'),

('Marie', 'Dubost', 'Sales manager'),

('Mariel', 'Montmatre', 'Marteking Specialist')

SQL Serveri do te afishoje nje mesazh gabimi te ngjashem me mesazhin e meposhtem: 

Cannot insert the value NULL into column 'FirstName', table 'Northwind.dbo.Employees'; column does not allow nulls. INSERT fails.

The statement has been terminated.


Shkaku per kete gabim eshte sepse ne rreshtin e pare tentojme te shtojme nje punonjes me mbiemrin Meielleur, emrin e te cilit e kemi vendosur NULL. Struktura e tabeles Employees nuk lejon vlera NULL ne kollonen Firstname, prandaj afishohet mesazhi i gabimit dhe komanad deshton.
Po cfare ka ndodhur me dy punonjesit e tjere? A jane shtuar  
Marie Dubost dhe Mariel Montmatre ne listen e punonjesve? 

Po te verifikojme permbajtjen e tabeles Employees do te veme re qe keta punonjes nuk jane shtuar.  Pra komanda ka patur nje gabim ndaj ka deshtuar.

Menyra e dyte - Shtimi i rreshtave me komanda INSERT te pavarura

Nese per shtimin e tre punonjesve perdorim tre komanda INSERT si me poshte:

INSERT INTO Employees(FirstName,Lastname,Title) 

VALUES  (NULL, 'Meielleur', 'Sales Account Manager')


INSERT INTO Employees(FirstName,Lastname,Title) 

VALUES ('Marie', 'Dubost', 'Sales manager')

INSERT INTO Employees(FirstName,Lastname,Title) 

VALUES ('Mariel', 'Montmatre', 'Marteking Specialist')


Serish do te na shfaqet nje mesazh gabimi i ngjashem me :

Cannot insert the value NULL into column 'FirstName', table 'Northwind.dbo.Employees'; column does not allow nulls. INSERT fails.
The statement has been terminated.
(1 row(s) affected)
(1 row(s) affected)


Por ne dallim nga komanda e pare nese verifikojme ne tabelen Employees do te veme re qe dy punonjesit e tjere Marie Dubost dhe Mariel Montmatre jane shtuat ne listen e punonjesve.

 


FORMA E DYTE INSERT me nje SELECT


Do te ndertojme nje tabele ndihmese per ilustrim punonjes. Kodi me poshte krijon tabelen punonjes

USE [Northwind]
GO

CREATE TABLE [dbo].[punonjes](
[EmployeeID] [int]  NOT NULL,
[LastName] [nvarchar](20) NOT NULL,
[FirstName] [nvarchar](10) NOT NULL,
[Title] [nvarchar](30) NULL,
[TitleOfCourtesy] [nvarchar](25) NULL,
[BirthDate] [datetime] NULL,
[HireDate] [datetime] NULL,
[Address] [nvarchar](60) NULL,
[City] [nvarchar](15) NULL,
[Region] [nvarchar](15) NULL,
[PostalCode] [nvarchar](10) NULL,
[Country] [nvarchar](15) NULL,
[HomePhone] [nvarchar](24) NULL,
[Extension] [nvarchar](4) NULL,
[Photo] [image] NULL,
[Notes] [ntext] NULL,
[ReportsTo] [int] NULL,
[PhotoPath] [nvarchar](255) NULL,
[AddedOn] [datetime] NULL,
[AddedBy] [varchar](50) NULL,
 CONSTRAINT [PK_punonjes] PRIMARY KEY CLUSTERED 
(
[EmployeeID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


Te shtojme ne tabelen punonjes 
vetem personat me titullin Dr. nga tabela Employees

INSERT INTO Punonjes(EmployeeId,Firstname,Lastname)
select EmployeeId,Firstname,Lastname from Employees
where TitleOfCourtesy='Dr.'

Te shtojme ne tabelen punonjes 
vetem personat me titullin Ms.

INSERT INTO Punonjes
select * from Employees
where TitleOfCourtesy='Ms.'



Do ti rikthehmi kur te flasim per funksionet tabele

Shembulli me poshte ilustron perdorimin e komandes SELECT qe shton ne tabele nje bashkesi rreshtash qe kthehen nga nje komande SELECT

CREATE FUNCTION liber(@dt1 DATETIME, @dt2 DATETIME)
RETURNS @L TABLE
(
Kodi INT PRIMARY KEY,
Data DATETIME,
Punonjesi VARCHAR(50),
Klienti VARCHAR(50),
Vlera MONEY
)
AS
BEGIN
INSERT INTO @L(Kodi,Data,Punonjesi,Klienti,Vlera)
SELECT 
Orders.OrderID,Orders.OrderDate,
FirstName+' '+LastName,
Customers.CompanyName,
SUM(UnitPrice*Quantity)
FROM Orders inner join [Order Details]
ON Orders.OrderID=[Order Details].OrderID
INNER JOIN Employees 
ON Orders.EmployeeID=Employees.EmployeeID
INNER JOIN 
Customers
ON Orders.CustomerID=Customers.CustomerID
WHERE OrderDate BETWEEN @dt1 and @dt2
GROUP BY 
Orders.OrderID,Orders.OrderDate,
FirstName+' '+LastName,
Customers.CompanyName
RETURN
END




Komanda UPDATE

  Komanda UPDATE modifikon permbajtjen e nje tabele. 
  Komanda UPDATE ka formen e pergjithshme si me poshte:

 UPDATE <emer_tabele>

 { SET column_1 = {expression | DEFAULT | NULL} [,...n]

 [FROM tab_name1 [,...n]]

 [WHERE condition]

 

Modifikimi aplikohet ne treshtat e tabeles <emer_tabele>  per te cilat kushtin WHERE eshte i vertete. Klauzola where eshte opsionale dhe ne kete rast modifikimi aplikohet ne te gjithe rreshtat e tabeles.
Per cdo rresht qe do te modifikohet komanda UPDATE ndryshon vleren e kollonave qe jane specifikuar ne listen “SET”, duke ju vendosur nje vlere konstante ose nje shprehje variablash. 

 Shembull 1 - Te modifikohet pozicioni i punonjesit Nancy Davolio (EmployeeId=1) nga Sales Reppresentative ne Sales Manager.

UPDATE Employees

SET Title = 'Sales Manager'

WHERE EmployeeID = 1

 


Shembull 2

Te ndryshojme pozicionin e punes te te gjithe punonjesve qe e kane pozicionin Sales reppresentative ne emertimin Sales Manager .

UPDATE Employees

SET Title='Sales Manager'

WHERE Title='Sales Representative'


Shembull 3

Te promovohen ne pozicionin Board Member te gjithe punonjesit qe kane realizuar me shume se 100 porosi.

 

UPDATE Employees

set Title='Board Member'

WHERE EmployeeID IN

(

SELECT EmployeeID

FROM Orders

Group BY EmployeeID

HAVING COUNT(*)>100

)

 

Shembulli 3 perdor tekniken e subquery duke percaktuar nepermjet nje query te brendeshme ne klauzolen WHERE te komandes UPDATE cilet jane rreshtat ku do te aplikohet modifikimi. 


Shembull 4 Te ndryshojme pozicionin e punes se punonjesve qe kane realizuar porosi gjate vitit 1996. Komanda me poshte ilustron perdorimin e klauzoles FROM. 

 

UPDATE Employees

SET Title='Board Member'

FROM Employees,Orders

WHERE Employees.EmployeeID=Orders.EmployeeID

AND OrderDate BETWEEN '1998-5-6' AND '1999-2-1'

 

Ne kete shembull ilustrohet perdorimi i kaluzoles from per te perfshire ne komanden UPDATE edhe nje tjeter tabele, tabela Orders. Kjo tabele e dyte eshte e nevojshme per shkak se kollona Orderdate do te sherbeje per te percaktuar cilat rreshta do te modifikohen. Vendosja e dy tabelava te ndara me presje  Employees,Orders e kombinuar me kushtin Employees.EmployeeID=Orders.EmployeeID realizon INNER JOIN midis dy tabelave, duke mundesuar qe ndersa modifikohet nje kollone e tabeles Employees, kollona Title, te perdoret nje kollone e tables Orders per te filtruar rreshtat.

 


Shembull 5 - Perdorimi i CASE ne komanden UPDATE

Ne kete shembull te fundit do te ilustrojme perdorimin e CASE ne komanden UPDATE. Nepermjet konstruktit CASE kemi mundesi qe te modifikojme vleren e nje kollone bazuar ne vleren qe ajo ka aktualisht. Supozojme se na paraqitet situata e meposhtme:

Kompania Northwind vendos te modifikoje cmimet e produkteve te saj duke aplikuar nje rritje te pershkallezuar 10%, 20% dhe 30%.  Cmimi do te rritet mbi bazen e cmimit aktual te produktit.

Nese cmimi i produktit per njesi eshte me i ulet se 20 euro atehere rritja do te jete 10%,

Nese cmimi i produktit do te jete me i larte se 20 dhe me i ulet se 5o euro atehere rritja do te jete 20% ,

ndersa nese cmimi aktual eshte me i larte se 50 euro per njesi rritja do te jete 30%.

Komanda me poshte realizon kete kerkese kerkese:

UPDATE Products

SET UnitPrice = CASE

                        WHEN UnitPrice <20  THEN UnitPrice*1.1

                        WHEN UnitPrice between 20 and 50 THEN UnitPrice*1.2

                        ELSE UnitPrice*1.3

                      END


Konstrukti CASE kthen nje shprehje ne varesi te kushtit llogjik, por kjo shprehje nuk eshte e thene te jete e bazuar ne kollonen qe po modifikohet. 

Shembujt me poshte e ilustrojne kete rast:

UPDATE Products

SET UnitPrice = CASE

                        WHEN CategoryID =1  THEN UnitPrice*1.1

                        WHEN CategoryID =2 THEN UnitPrice*1.2

                        ELSE UnitPrice*1.3

                      END

  Kjo komande ndryshon cmimet e produkteve duke u bazuar ne kodin e kategorise se ciles ato i perkasin. Cmimet e produkteve te kategorise 1 rriten me 10% cmimet e produkteve te kategorise 2 rriten me 20% ndersa te gjithe kategorite e tjera rriten me 30%.

Gjithashtu nuk eshte gabim qe tek kushti WHEN te perdoren dy kollona te ndryshme por ne kete rast duhet te jemi te kujdesshem me interpretimin:

UPDATE Products

SET UnitPrice = CASE

                        WHEN CategoryId=1  THEN UnitPrice*1.1

                        WHEN  ProductID=1 THEN 200

                        ELSE UnitPrice*1.3

                      END

Komanda e mesiperme do te aplikoje nje rritje cmimesh me 10% per te gjithe produktet e kategorise 1 perfshire produktin me kodin 1 dhe nje rritje cmimesh prej 30% per te gjithe proiduktet e tjera.




Komanda DELETE


Komanda DELETE fshin rreshta nga tabelat.Kjo komande ka dy forma te ndryshme:

 

DELETE FROM table_name

[WHERE <shrehje llogjike>];

 

DELETE table_name

FROM table_name [,…]

[WHERE condition];

 

Te gjithe rreshtat qe plotesojne kushtin WHERE do te fshihen. Listimi ne menyre eksplicite e kolonave te nje tabele nuk eshte e nevojshme (dhe nuk lejohet), sepse komanda DELETE operon mbi rreshtat dhe jo mbi kolonat.

 

Shembull1

Te fshijme te gjithe punonjesit me kodin me te madh se 9:

DELETE FROM Employees

WHERE EmployeeID > 9

 


Kushti WHERE ne komanden DELETE mund te permbaje nje query te brendeshme, per shembull:

 

Shembull 2

Te fshijme te gjithe punonjesit qe nuk kane realizuar asnje porosi:

DELETE FROM Employees

where EmployeeID

NOT IN (SELECT EmployeeID FROM Orders)


Shembull 3  Komanda DELETE ne menyre analoge me komanden UPDATE, mund te perdore edhe klauzolen FROM per te marre nepermjet  JOIN kollona nga tabela te tjera qe te perdoren ne klauzolen WHERE. Te fshijme te gjithe punonjesit qe kane realizuar shitje brenda nje periudhe te caktuar.

 

DELETE Employees 

 FROM Employees,Orders

 WHERE Employees.EmployeeID=oRDERS.EmployeeID

 AND OrderDate BETWEEN '1999-1-1' AND '2000-1-1'

Kujdes:

Perdorimi I klauzoles WHERE ne komanden DELETE eshte opsional. Ne qofte se klauzola WHERE mungon, te gjithe rreshtat e tabeles do te fshihen.

Komanda TRUNCATE TABLE

Per fshirjen e permbajtjes se tabeles mund te perdoret edhe komanda TRUNCATE TABLE.
Kjo komande perdoret rralle pasi ajo fshin te gjithe rreshtat e tabeles. Kjo komande nuk ka klauzole WHERE ku te percaktohet nje filter qe perzgjedh cilat rreshta do te fshihen.

Komanda TRUNCATE operon mbi PAGE ndersa komanda DELETE operon mbi rreshta, gje qe e ben komanden TRUNCATE shume me te shpejte se komanda DELETE per fshirjen e te gjithe rreshtave te tabeles.

Nje tjeter dallim i rendesishem midis dy komandave per fshirjen e permbajtjes se tabeles eshte se nese fshihet permbajtja e tabeles nepermjet TRUNCATE nuk eshte e mundur qe te ekzekutohen Triggera.

Komanda  TRUNCATE TABLE ka sintaksen e meposhtme:

TRUNCATE TABLE <emer_tabele>


Klauzola OUTPUT

Rezultati i ekzekutimit te nje komande INSERT, UPDATE ose DELETE gjithmone permban vetem tekst qe tregon numrin e rreshtave te prekur nga ky veprim (“3 rows deleted”). 
Nqs ky informacion nuk eshte i mjaftueshem, mund te perdorim klauzolen OUTPUT, e cila afishon ne menyre  rreshtat qe jane prekur nga komandat INSERT, UPDATE ose DELETE.

Klauzola OUTPUT perdor tabelat “INSERTED” dhe “DELETED” per te shfaqur rezultatin e kerkuar. 

Per me teper  klauzola OUTPUT mund te perdoret e kombinuar me nje shprehje INTO per ti ruajtur rreshtat e prekur ne nje tabele tjeter. 
Per kete arsye perdoret nje variable tabele per te ruajtur rezultatin.

Shembulli1 ilustron  se si shprehja OUTPUT punon me nje komande DELETE.

Shembull 1 - Klauzola OUTPUT ne komanden DELETE

DELETE  Employees 

OUTPUT DELETED.EmployeeID,deleted.lastname  

WHERE EmployeeID>9

ose 

DELETE  Employees 

OUTPUT DELETED.*  

WHERE EmployeeID>9

Kujdes:

Kushti WHERE i perket komandes DELETE, dmth ne shembullin me siperm fshihen nga tabela Employees te gjith rreshtat qe plotesojne kushtin WHERE EmployeeID>9 dhe te gjithe rreshtat e fshire afishohen . 



Shembull 2 - Kapja e vlerave nga klauzola OUTPUT

Ne disa raste eshte e nevojshme qe rreshtat qe kthehen nga klauzola OUTPUT te kapen dhe te ruhen ne nje tjeter tabele, per shembull per audit. Kjo gje mund te realizohet nepermjet kombinimit te OUTPUT me klauzolen INTO.  Kodi me poshte ilustron kete teknike:

DECLARE @del_table TABLE (emp_no INT, emp_lname CHAR(20));

DELETE  Employees 

OUTPUT DELETED.EmployeeID,deleted.lastname  INTO @del_table(emp_no,emp_lname)

WHERE EmployeeID>9

SELECT * FROM @del_table 


Kodi i mesiperm do te afishonte nje liste me kodet dhe mbiemrat e punonjesve te fshire.

 


Shembull 3 - Klauzola OUTPUT ne komanden UPDATE

Ne komanden UPDATE klauzola OUTPUT mund te kape rreshtat e modifikuar duke lezuar ne tabelen INSERTED dhe versionin e rreshtave para modifikimit duke lezuar tabelen DELETED.
Shembulli me poshte ilustron perdorimin e OUTPUT me komanden UPDATE

UPDATE Employees

SET Title='Sales Manager'

OUTPUT Deleted.EmployeeID,deleted.FirstName,deleted.LastName,deleted.Title 'OldTitle',inserted.Title 'NewTitle'

WHERE EmployeeID>9


Komanda e mesiperme modifikon pozicionin e punes se disa punonjesve.
Komanda afishon nje rezultat te ngjashem me figuren me poshte:


 EmployeeId Firstname LastName OldTitle     NewTitle
 121Marie  Pierre NULL Sales Manager
 122 John Smith NULL Sales Manager


Komanda MERGE

    SQL Server 2008 permban dhe komanden SQL  te quajtur MERGE. Kjo komande kombinon komandat INSERT dhe UPDATE ne nje shprehje atomike, ne varesi te ekzistences se rekordit. Aplikimi kryesor I komandes MERGE eshte ne “data warehouse”, ku tabelat duhet te freskohen ne menyre periodike me te dhenat e reja te cilat vijne nga sistemi OLTP (online transaction processing). Keto te dhena te reja mund te permbajne ndryshime ne rreshtat ekzistues ne tabele dhe/ose rreshta te rinje duhet te shtohen. Nqs nje rresht ne te dhenat e reja I korespondon me ndonje rresht ekzistues te tabeles, nje komande UPDATE duhet te ekzekutohet. Ne te kundert nje komande INSERT duhet te ekzekutohet.

Versionet e meparshme se  SQL Server 2008, e implementonin kete sin je sekuence me INSERT dhe UPDATE,Duke e zgjeruar Transact-SQL me kete komande te re, SQL Server 2008 thjeshton implementimin e data warehouse dhe e bene me performant.

Per ilustrimin e komandes MERGE do te perdorim nje tabele ndihmese me emrin punonjes.

CREATE TABLE PUNONJES

(

EmployeeId INT PRIMARY KEY,

Firstname VARCHAR(20),

Lastname VARCHAR(20),

Title VARCHAR(20)

)

Do te shtojme ne tabelen punonjes te gjithe punonjesit nga tabela Employees qe e kane kodin me te madh se 5. Per secilin nga keta punonjes do te ruajme ne tabelen Punonjes Title = 'NEW'

INSERT INTO PUNONJES

SELECT EmployeeID,FirstName,LastName,'NEW'

FROM Employees WHERE EmployeeID>5

Pas ketyre dy hapave parapergatitore po formulojme problemin qe kerkon zgjidhje nepermjer komandes MERGE. 

Duam te shkrijme tabelen Employees ne tabelen Punonjes. Procesi i shkrirjes te jete i tille qe: 

  • Punonjesit qe  jane ne tabelen Employees dhe nuk jane ne tabelen Punonjes te kopjohen,
  • Punonjesit qe ndodhen tashme ne tabelen Punonjes te mos kopjohen por Title i tyre te modifikohet me title qe punonjesi ka ne tabelen Employees
Kollona qe do te perdoret per te verifikuar nese nje punonjes ekziston apo jo ne te dy tabelat do te jete kollona EmployeeID qe identifikon punonjesin. 
Me poshte paraqitet komanda MERGE qe realizon kerkesen e mesiperme:

MERGE INTO PUNONJES P

USING (SELECT EmployeeId,FirstName,LastName,Title FROM Employees) E

ON P.EmployeeID=E.EmployeeID

WHEN MATCHED THEN 

UPDATE SET P.Title=E.Title

WHEN NOT MATCHED THEN

INSERT (EmployeeId,FirstName,LastName,Title)

VALUES(E.EmployeeId,E.FirstName,E.LastName,E.Title);


Klauzola OUTPUT ne komanden  MERGE 

Klauzola OUTPUT mund te perdoret gjithashtu edhe me komanden MERGE 

Ne kete rast klauzola OUTPUT ka ne dispozicion tabelat INSERTED dhe DELETED si edhe variablin e sistemit $action.

Me poshte paraqitet nje version i komandes MERGE per shkrirjen e tabelave te punonjesve qe perdor klauzolen OUTPUT:

MERGE INTO PUNONJES P

USING (SELECT EmployeeId,FirstName,LastName,Title FROM Employees) E

ON P.EmployeeID=E.EmployeeID

WHEN MATCHED THEN 

 UPDATE SET P.Title=E.Title

WHEN NOT MATCHED THEN

 INSERT (EmployeeId,FirstName,LastName,Title)

 VALUES(E.EmployeeId,E.FirstName,E.LastName,E.Title)

OUTPUT $ACTION,INSERTED.*,DELETED.* ;


-- funksioni getdate() kthen kohen e tanishme

print getdate()


select GETDATE()



Ushtrime

Ushtrim 1

Modifikoni cmimin e produkteve qe kane me pak se 10 cope ne stok. Rriteni cmimin e tyre me 10%.

Zgjidhje

update Products

set UnitPrice=UnitPrice*1.1

where UnitsInStock<10

Ushtrim 2

Modifikoni cmimin e produkteve sipas kriterit te meposhtem:

  • produktet me cmim nen 20 euro do te rriten me 10% duke qene se ato mund te jene produkte te shportes
  • produkte me cmim me te madh se 20 euro dhe me te vogel se 51 euro te rriten eme 20%
  • produktet me cmim me te madh se 50 euro te rriten me 25%

zgjidhje

update Products

set UnitPrice=case 

when  UnitPrice<20 then UnitPrice*1.1 

when UnitPrice<50 then UnitPrice*1.2

else UnitPrice*1.25

end

Ushtrim 3

Promovoni punonjesit duke modifikuar pozicionin e tyre ne Board Members nese ata kane trajtuar me shume se 50 porosi.

Zgjidhje

update Employees

set Title='Board Member'

where EmployeeID

IN (

select EmployeeID

from

Orders

group by EmployeeID

having COUNT(OrderID)>50 

)


Ushtrim 4

Promovoni punonjesit duke modifikuar pozicionin e tyre ne Board Members nese ata kane realizuare nje xhiro financiare me te madhe se 10000 euro

Zgjidhje

update  Employees

set Title='Board Member'

where EmployeeID in 

 select o.EmployeeID

 from orders o join[Order Details] od

on o.OrderID=od.OrderID

group by EmployeeID

having SUM(od.Quantity*od.UnitPrice)>200000

 )


Ushtrim 5

Tek te gjithe porosite (orderdetails) qe permbajne produkte te kategorise me kodin 1 te aplikohet nje ulje prej 15% .(discount = 0.15)

zgjidhje