2017-12-31 48 views
0

Ich kann viel mit den Grundlagen von SQL, aber ich habe mit dieser komplexeren Aufgabe zu kämpfen. Ich habe drei Tische so aufgebaut.Verwenden Sie eine Auswahl als Quelle während der Zusammenführung und Einfügen in mehrere Tabellen

Person

  • Identifikator
  • Attribut
  • Typ

Mitarbeiter

  • Identifikator
  • hobby_id

Hobby

  • hobby_id
  • Attribut

I Reihen von Person von bestimmten Arten auswählen müssen, die in der Mitarbeitertabelle vorhanden sein. Wenn die employee-Tabelle eine hobby_id (nicht null) hat, muss ich die Hobby-Zeile mit dem Attribut aus der entsprechenden Personenzeile aktualisieren. Wenn die Mitarbeiterzeile KEINE hobby_id hat, muss ich eine neue mit dem Attribut person erstellen und den Mitarbeiter Hobby_id auf die neue ID setzen.

Ich habe viele Ansätze ausprobiert. Ich begann mit einer IF/ELSE-Syntax, die wirklich unordentlich wurde, also versuchte ich eine CASE-Anweisung, aber es scheint, dass ich keine Einfügungen oder Aktualisierungen in diesen vornehmen kann. Ich versuche gerade, einen MERGE zu verwenden, weil er robust genug zum Arbeiten aussieht. Meine aktuelle ‚Iteration‘, das ich arbeite mit ist:

USE MY_DB 

SET @nextHobbyId = (SELECT MAX(HOBBY_ID) FROM HOBBY) 

MERGE DBO.HOBBY AS TARGET 

USING (
    SELECT ATTRIBUTE, HOBBY_ID 
    FROM AA.PERSONe 
     INNER JOIN DBO.EMPLOYEE v 
     ON e.IDENTIFIER= v.IDENTIFIER 
) AS SOURCE (hobbyId, ATTRIBUTE) 

ON (TARGET.HOBBY_ID = SOURCE.HOBBY_ID) 

WHEN MATCHED 
THEN UPDATE SET 
    TARGET.ATTRIBUTE= SOURCE.ATTRIBUTE 

WHEN NOT MATCHED BY TARGET 
THEN INSERT (HOBBY_ID, ATTRIBUTE) 
VALUES (@nextHobbyId + 1, ATTRIBUTE); 

Sie sehen kann ich nicht einmal versuchen, die Mitarbeitertabelle mit dem neuen hobby_id in dieser Iteration zu aktualisieren, da ich zur Zeit eine Fehlermeldung erhalten, dass „-Attribut ist ein ungültiger Spaltenname "in der allerletzten Zeile.

Dinge zu beachten, Hobby ID keine Identität hat, sondern den Code in unserer Anwendung, die die einzige sein, verwendet die Tabelle wie etwas verwendet zu berühren:

SELECT NEXT VALUE FOR... 

wenn Einsätze dabei versuche ich ahmen Sie das nach, indem Sie den maximalen Wert + 1 wählen. Während mein Code wahrscheinlich niemals gleichzeitig mit dem ursprünglichen Code läuft, mache ich mir Sorgen über eine mögliche Wettlaufsituation.

Wie kann ich das schaffen? Ich bin nicht an eine Zusammenführung gebunden, wenn es nicht der richtige Weg ist.

Antwort

0

Wenn ich richtig verstanden habe, kann es ziemlich einfach erfolgen:

;with CTE as (
    select * from Person where identifier is in (select identifier from Employees 
) 

update Hobby set ... --some updates 
where hobby_id in (select hobby_id from CTE where hobby_id is not null) 

insert into Hobby 
... -- here, through join most probably you can perform insert or any other updating operation 
Verwandte Themen