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.
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.
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.