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.