sql >> Database >  >> RDS >> Sqlserver

Gegevens samenvoegen in twee bestemmingstabellen

Theoretisch zou er een oplossing moeten zijn om dit in één verklaring te doen, maar ik heb het tot nu toe niet kunnen vinden. *

Hier is hoe het kan worden gedaan met twee MERGE uitspraken:

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

*Onderdeel met updaten Actieve kolom:

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

zou in de bovenste query moeten passen en een enkele samenvoeginstructie maken voor alle bewerkingen, maar het geeft een foutmelding:

zelfs als het duidelijk een enkele kolom is, en normale niet-samenvoegingsupdate werkt prima . Misschien weet iemand hier een reden en/of een oplossing voor.




  1. MySql logische volgorde op

  2. Hoe te SQL Selecteer een één-op-veel relatie en voeg de uitvoer samen

  3. Permanente gegevens instellen voor Carto/Postgresql op ACI

  4. 7 dingen om op te letten bij uw PostgreSQL-implementatie