sql >> Databasteknik >  >> RDS >> Sqlserver

Slå samman data till två måltabeller

Teoretiskt borde det finnas en lösning för att göra detta i ett enda uttalande, men jag har hittills inte lyckats hitta den. *

Så här kan det göras med två MERGE uttalanden:

WITH CTE_trgt AS 
(
    SELECT c.compid, c.ownerid, t.projid, t.active 
    FROM component c
    INNER JOIN trace t ON c.compid = t.compid
)
MERGE CTE_trgt t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY TARGET
    THEN INSERT (ownerid)
    VALUES (s.ownerid)
OUTPUT
    INSERTED.compid, s.projid, 1 INTO trace;


MERGE trace t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET t.active = 0;

SQLFiddle DEMO

*Del med att uppdatera kolumnen Aktiv:

WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET t.active = 0

bör kunna passa in i den övre frågan och skapa en single merge-sats för alla operationer, men det ger ett felmeddelande:

även om det uppenbarligen är en kolumn, och vanliga icke-sammanfogade uppdateringar fungerar bra . Kanske någon vet en orsak och/eller en lösning för detta.




  1. installera både mysql och mysqlnd på ubuntu 12.04

  2. SQL Server 2008 - Hjälp att skriva enkel INSERT Trigger

  3. Varför kan jag skapa en tabell med PRIMARY KEY på en nullbar kolumn?

  4. Infoga i tabell med select-sats plus ytterligare kolumn i SQL Server 2008