sql >> Database teknologi >  >> RDS >> Sqlserver

Eksempel på en simpel fletsætning i SQL Server

Følgende eksempel bruger T-SQL til at flette to tabeller i SQL Server. Den bruger VALUES tabelværdikonstruktør som kildetabellen.

Antag, at vi opretter en tabel som denne:

CREATE TABLE Idiots (
    IdiotId int IDENTITY(1,1) NOT NULL,
    FirstName varchar(50),
    LastName varchar(50)
    );

INSERT INTO Idiots VALUES 
    ('Peter', 'Griffin'), 
    ('Homer', 'Simpson'), 
    ('Ned', 'Flanders');

SELECT * FROM Idiots;

Resultat:

+-----------+-------------+------------+
| IdiotId   | FirstName   | LastName   |
|-----------+-------------+------------|
| 1         | Peter       | Griffin    |
| 2         | Homer       | Simpson    |
| 3         | Ned         | Flanders   |
+-----------+-------------+------------+

Og antag, at vi vil udføre en fusionsoperation. Vi vil gerne indsætte nye rækker, men hvis der allerede findes en række med værdier, der matcher dem i vores kilde, så vil vi i stedet opdatere den eksisterende række (i stedet for at indsætte en ny række).

Vi kan gøre det sådan her:

DECLARE @Changes TABLE(Change VARCHAR(20));

MERGE INTO Idiots AS Target  
USING ( VALUES 
            (3, 'Ned', 'Okily Dokily!'), 
            (4, 'Lloyd','Christmas'), 
            (5, 'Harry', 'Dunne')
        ) AS Source ( IdiotId, FirstName, LastName )  
ON Target.IdiotId = Source.IdiotId
AND Target.FirstName = Source.FirstName
WHEN MATCHED THEN
    UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
WHEN NOT MATCHED BY TARGET THEN
    INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
OUTPUT $action INTO @Changes;

SELECT Change, COUNT(*) AS Count  
FROM @Changes  
GROUP BY Change;

Resultat:

+----------+---------+
| Change   | Count   |
|----------+---------|
| INSERT   | 2       |
| UPDATE   | 1       |
+----------+---------+

To nye rækker blev indsat og en blev opdateret.

Her brugte vi en tabelværdikonstruktør (VALUES ) for at angive de nye værdier for tabellen.

I dette tilfælde tjekkede vi IdiotId og FirstName kolonner. Grundlæggende, hvis ID og fornavn er det samme, så ønsker vi at opdatere den eksisterende række i stedet for at indsætte en ny.

Vi brugte WHEN MATCHED for at angive, hvad der skal ske, når data fra vores VALUES klausul matcher data i måltabellen. I dette tilfælde opdaterer vi blot rækken med de nye data fra VALUES .

Vi brugte WHEN NOT MATCHED BY TARGET for at specificere, hvad der skal ske, når der ikke er noget match. I dette tilfælde indsætter vi en ny række med de nye data.

Vi brugte også en variabel kaldet @Changes for at se output fra vores fusionsoperation. Vi brugte OUTPUT klausul efter fusionsoperationen for dette. Det var det, der gav os den resulterende tabel ovenfor.

Vi kan nu tjekke måltabellen for at se, hvilken effekt fusionsoperationen havde på den:

SELECT * FROM Idiots;

Resultat:

+-----------+-------------+---------------+
| IdiotId   | FirstName   | LastName      |
|-----------+-------------+---------------|
| 1         | Peter       | Griffin       |
| 2         | Homer       | Simpson       |
| 3         | Ned         | Okily Dokily! |
| 4         | Lloyd       | Christmas     |
| 5         | Harry       | Dunne         |
+-----------+-------------+---------------+

Vi kan se, at Idiot nummer 3 (Ned) har fået opdateret sit efternavn. Vi kan også se, at to nye idioter er blevet tilføjet til bordet (Lloyd og Harry).


  1. Returner pre-UPDATE kolonneværdier kun ved brug af SQL

  2. Sundhedstjek på Exadata ved hjælp af Exachk Utility

  3. COLLATION() Funktion i Oracle

  4. SQL FINDER Operatør for begyndere