Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Master-Detail Tabellensätze klonen [Denksportaufgabe] (https://www.delphipraxis.net/54504-master-detail-tabellensaetze-klonen-%5Bdenksportaufgabe%5D.html)

alzaimar 5. Okt 2005 16:17

Datenbank: MSSQL • Version: 2000 • Zugriff über: egal

Master-Detail Tabellensätze klonen [Denksportaufgabe]
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo SQL-Spezis,

Ich habe eine Aufgabe (nee, keine Hausaufgabe, schaut mal aufs Alter ;-) ). Es geht ums Duplizieren von Einträgen einer Master-Detail Beziehung. Die Lösung sollte ein SQL-Skript sein (Microsoft SQL-Server Dialekt). Cursors sind verboten (weil sie lahm sind).

Gegeben sei eine Mastertabelle (die ID-Spalte ist ein Identity-Wert (also AutoInc)):
Code:
ID Name Eigenschaft
1  Fritz  1
2  Franz  2
3  Hubert 2
Die Detailtabelle sei (ID-Spalte wieder ein Identity-Wert, Verknüpfung über Detail.MasterID --> Master.ID):
Code:
ID MasterID Details
1  1        Fritz-1
2  1        Fritz-2
3  2        Franz-1
4  2        Franz-2
5  2        Franz-3
6  2        Franz-4
7  3        Hubert-1
8  3        Hubert-2
9  3        Hubert-3
Einfache Aufgabe: Klone alle Einträge (sowie die Detaileinträge) mit Eigenschaft = X. Bei X = 2 soll z.B. Franz und Hubert in der Mastertabelle und die insgesamt 7 Detaileinträge dupliziert werden.
Das Resultat wäre dann:
MASTER
Code:
ID Name Eigenschaft
1 Fritz   1
2 Franz   2
3 Hubert  2
4 Franz   2
5 Hubert  2
DETAIL:
Code:
ID MasterID Details
 1  1       Fritz-1
 2  1       Fritz-2
 3  2       Franz-1
 4  2       Franz-2
 5  2       Franz-3
 6  2       Franz-4
 7  3       Hubert-1
 8  3       Hubert-2
 9  3       Hubert-3
10  4       Franz-1
11  4       Franz-2
12  4       Franz-3
13  4       Franz-4
14  5       Hubert-1
15  6       Hubert-2
16  6       Hubert-3
Die IDs der geklonten Einträge ist egal, Hauptsache die Referenzen sind korrekt.

Ich habe eine Lösung, die allerdings in der Master-Tabelle eine Hilfsspalte verwendet ('Clone'). Geht es auch ohne? Gibt es Optimierungsmöglichkeiten?

alzaimar 6. Okt 2005 22:59

Re: Master-Detail Tabellensätze klonen [Denksportaufgabe]
 
Nu pusht der Alz.
Es tobt der Sall
und ruft
"Das Ganze noch einmal!" :party:

marabu 7. Okt 2005 13:11

Re: Master-Detail Tabellensätze klonen [Denksportaufgabe]
 
Hallo alzaimar,

versuchst du den Rheinländern bei der Eröffnung der fünften Jahreszeit zuvorzukommen?

Ich habe mir deine Lösung angesehen, obwohl mir das Datenmodell etwas sehr synthetisch aussieht. Ganz klar brauchst du irgendwo die Information, welcher neue PK durch cloning aus welchem alten PK entstanden ist, da du sonst die details nicht nachführen kannst. Und selbstverständlich musst du später einen clone vom Original unterscheiden können. Wenn du deine master table nicht durch ein rein technisch motiviertes Attribut verunstalten willst, dann kannst du auch eine temporäre Tabelle verwenden:

SQL-Code:
...
create table #t (maName varchar(20) null, property int null, clone)
insert into #t (maName, Property, Clone)
  select maName, Property, masterID from testMaster where Property = @cloneProperty
...
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz