Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Scal dane w dwie tabele docelowe

Teoretycznie powinno być rozwiązanie, aby to zrobić w jednym oświadczeniu, ale jak dotąd nie udało mi się go znaleźć. *

Oto jak można to zrobić za pomocą dwóch MERGE oświadczenia:

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;

Demo SQLFiddle

*Część z aktualizacją aktywnej kolumny:

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

powinien być w stanie zmieścić się w górnym zapytaniu, tworząc pojedynczą instrukcję scalania dla wszystkich operacji, ale zgłasza błąd:

nawet jeśli jest to oczywiście pojedyncza kolumna, a zwykła aktualizacja bez łączenia działa dobrze . Może ktoś zna powód i/lub obejście tego problemu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać wszystkie błędy wszystkich pakietów SSIS w rozwiązaniu?

  2. SQL Server 2008 — Zmniejszanie dziennika transakcji — Jakiś sposób na automatyzację?

  3. Musisz zadeklarować zmienną @myvariable error za pomocą sparametryzowanego zapytania ADO

  4. Test wydajności MS SQL Server w systemie Linux i Windows w celu wykrycia różnicy

  5. Jak wygenerować skrypt INSERT dla tabeli z polem VARBINARY(MAX)?