MERGE Słowo kluczowe Merge zostało przedstawione w Sql Server 2008. Jego celem jest ułatwienie pisania skomplikowanych poleceń, które muszą wykonać różne funkcję na danej tabelce jak DELETE,INSERT i UPDATE za jednym zamachem.

Wcześniej ,aby wykonać te wszystkie funkcję trzeba było pisać wyrażenia INSERT, UPDATE i DELETE oddzielnie.

Teraz jednak istnieje możliwość napisania te samej logiki w jednym wyrażeniu MERGE. W tym wyrażeniu przykładowo możemy  sprawdzić czy nasze dane się zgadzają i wtedy wykonać polecenie UPDATE ,a jeśli tak nie jest to wykonać polecenie INSERT.

Najważniejszą zaletą polecenia MERGE jest  fakt ,że wszystkie dane w trakcie tych operacji są odczytywane tylko raz  i odtworzone tylko raz. Przy użyciu trzech poleceń UPDATE,INSERT i DELETE dane naturalnie byłby odczytywane i odtwarzane 3 razy.

Co oznacza ,że w teoriipolecenie MERGE będzie przynajmniej 3 razy szybsze.

Jak więc działa to polecenie MERGE. Utwórzmy dwie tabelki i uzupełnimy je danymi.

CREATE TABLE Students
(
StudentID INTEGER PRIMARY KEY,
Name VARCHAR(15)
)
GO
INSERT INTO Students
VALUES
(1,'Adam'),
(2,'Ewa'),
(3,'Dominika'),
(4,'Zofia'),
(5,'Ewelina')

Tabelka Studenci zawiera tylko id studenta oraz jego imię.

CREATE TABLE StudentExamPoints
(
StudentID INTEGER REFERENCES Students,
StudentPoints INTEGER,
Pass BIT default 0,
Cheater BIT 
)
INSERT INTO StudentExamPoints
VALUES(1,51,0,0),(2,72,0,0),(3,86,0,1)

Natomiast tabelka StudnetExamPoint zawiera id studenta, liczbę jego punktów z ezgaminu oraz wartości bitowe określające czy student zdał egzamin i czy przypadkiem na nim nie oszukiwał.

SELECT S.Name
	,Ep.StudentPoints
	,Ep.Pass
	,EP.Cheater
FROM dbo.StudentExamPoints AS Ep
JOIN  dbo.Students AS S ON S.[StudentID] = Ep.[StudentID]

Powyżej prosty SELECT z JOINEM pokazujący wyniki studentów z egzaminu.

image

Jak widać z 5 studentów tylko 3 przyszło w ogóle na egzamin. Widzimy też  ,że jeden ze studentów, który pisał egzamin został złapany na ściąganiu.

Naszym zadaniem jest teraz:

  • Skasować z listy studentów, studenta, który oszukiwał.
  • Zaznaczyć zdanie egzaminu dla studentów, którzy uzyskali więcej niż 70 punktów z egzaminu.
  • Umieścić rekordy z egzaminem dla studentów, którzy nie przyszli na dany egzamin.

Teraz napiszemy wyrażenie MERGE. Klauzura USING deklaruje SELECT-a do którego będziemy się odnosić przez te 3 operację. Jak widać działa ona też jak JOIN.

MERGE StudentExamPoints AS ex
USING (SELECT StudentID,Name FROM Students) AS st
ON ex.StudentID = st.StudentID
WHEN MATCHED AND ex.Cheater = 1 THEN DELETE
WHEN MATCHED AND ex.StudentPoints > 70 THEN UPDATE SET ex.Pass = 1
WHEN NOT MATCHED THEN
INSERT(StudentID,StudentPoints,Pass,Cheater)
VALUES(st.StudentID,0,0,0);

Zapytanie MERGE ma też swoje ograniczenia.

  • Nie możemy wykonać w jednym MERG-u wielu UPDATE-ów i innych funkcji. Możemy wykonać tylko jedno polecenie  DELETE, jedno polecenie UPDATE i jedno polecenie INSERT.
  • Kiedy używamy klauzury MATCH z pewnym warunkiem wśród innych poleceń musi być ona użyta jako pierwsza. Przykładowo polecenie “NOT MATCHED” nie mogło być pierwszym poleceniem w tym zapytaniu.
  • Wyrażenie MERGE  kończy się średnikiem.

Po tej operacji z tabelki Studenci powinna zostać skasowana Dominika ponieważ oszukiwała. Ewa zdobyła 72 punkty z egzaminu więc go zdała .Czyli jej pole bitowe “Pass” powinno ulec zmianie.

image

Natomiast studenci, którzy nie przyszli na egzamin “Zofia” i “Ewelina”  powinni zostać dodani do tabelki z egzaminami z punktacją zerową.

A u Adama nic się nie zmieniło.