Wie Tabellenbaum kopieren?



  • Hi,

    gegeben seien 4 Tabellen:

    Basis
    ID	Wert
    1	2
    2	4
    3	6
    
    Stufe_1
    ID_Basis	ID	Wert_1
    1			1	3
    1			2	9
    1			3	27
    
    Sufe_2
    ID_Basis	ID_Stufe_1	ID	Wert_2
    1			1			1	1
    1			1			4	2
    
    und Stufe_3
    ID_Basis	ID_Stufe_1	ID_Stufe_2	ID	Wert
    1			1			1			1	1
    1			1			1			2	2
    1			1			4			3	3
    1			1			4			4	4
    

    Dabei ist ID jeweils ein Autowert.

    Gibt es eine Möglichkeit mit MS-Jet-SQL, diesen gesamten Baum der an Basis Satz 1 angehängt ist durch einen oder warscheinlicher mehrere SQL-Befehle an Basis Satz 2 dranzukopieren ohne sich durch alle Stufen und alle einzelnen Datensätze durchhangeln zu müssen. Bei Stufe 1 geht das ja noch, aber schon bei Stufe 2 wirds komplizierter, da ja dann jeweils die unter-IDs mit erfasst werden müssen.

    Auf der ersten Stufe habe ich das so realisieren können:

    insert into Stufe_1 ( ID_Basis, Wert_1 ) select 2, Wert_1 from  Stufe_1  where id_basis = ( select Max( ID_Basis ) from  Stufe_1 );
    

    Nur für den Rest weiß ich da nicht weiter. Währe schön, wenn da jemand eine Lösung hätte.

    Danke und Gruß Mümmel



  • warum werden die anderen Stufen überhaupt jedes mal mitgezogen?

    id_stufe_2 reicht ja schon, um id_stufe_1 und id_basis eindeutig festzulegen.

    würde das ganze dann doch deutlich vereinfachen



  • Sieht so aus als ob du beim Insert "Stufe_1.ID" über Auto-Inkrement erzeugen lässt. Das wird dann etwas kompliziert, weil du die Verbindung zwischen den originalen "Stufe_1.ID" Werten und den neu eingefügten herstellen müsstest.

    Einfacher würde es wenn du die "Stufe_1.ID" Werte mitkopieren könntest.

    Sonst müsstest du irgendwie ein explizites Mapping zwischen den alten und den neuen Werten machen. Und das geht nur wenn die übrigbleibenden Spalten in "Stufe_1" ausreichen um Zeilen "unique" zu machen. Was vermutlich nicht der Fall sein wird, da man ja vermutlich zwei Zeilen mit dem selben "Wert" eintragen kann?

    Sonst könntest du noch die neuen IDs mit Hand vergeben.
    Also z.B. erstmal einen Offset ermitteln den du auf die alten IDs draufaddieren musst, so dass der niedrigste Wert "AlteID + Offset" grösser ist als die höchste aktuelle ID.
    Dann hast du dein explizites Mapping, und kannst die gewünschte Zuordnung herstellen.

    Und das natürlich für jede Ebene.

    Vermutlich wäre es aber die Zeit wert sich nochmal hinzusetzen und das Datenmodell zu überdenken.



  • Hi Zwurz und Hustbaer,

    schön, das ihr Euch darüber Gedanken macht.

    hier noch mal die Dateistruktur:

    Basis
    ID			Autowert
    Wert		Integer
    
    Stufe_1
    ID_Basis	Long Integer
    ID			Autowert
    Wert_1		Integer
    
    Sufe_2
    ID_Basis	Long Integer
    ID_Stufe_1	Long Integer
    ID			Autowert
    Wert_2		Integer
    
    und Stufe_3
    ID_Basis	Long Integer
    ID_Stufe_1	Long Integer
    ID_Stufe_2	Long Integer
    ID			Autowert
    Wert		Integer
    

    Die jeweiligen IDs der niederen Stufen werden nur durchgeschleift, um
    1. Auswertungen zu vereinfachen bei denen über größere Bereiche gruppiert oder gefiltert werden soll, um nicht immer eine View zu benötigen.
    2. Bei der Bearbeitung in Access dem der Werte eingeben will unmittelbar zu zeigen wo er ist.
    3. Bei Bearbeitung in einem Programm zu vermeiden, das ADODataSet Probleme beim Speichern hat, weil die Daten aus verschiedenen Tabellen kommen.
    Wert ist hier nur ein Synonym für die jeweils wirklich dahinter stehenden Felder.

    Das Problem beim Kopieren besteht darin, dass die IDs der niederen Stufen in den höheren Stufen nicht einfach kopiert werden können, sonst zeigen sie ja anschließend auf einen falschen Zweig. Es müssen also jeweils die zu dem jeweils neuen Unterzeig gehörenden IDs eingetragen werden.
    Theoretisch könnte man erst mal Nullen eintragen und das ganze dann mit einer View füllen, was mir aber nicht übermäßig sauber vorkommt.

    Gruß Mümmel



  • Hi Zwurz,

    zwutz schrieb:

    warum werden die anderen Stufen überhaupt jedes mal mitgezogen?

    id_stufe_2 reicht ja schon, um id_stufe_1 und id_basis eindeutig festzulegen.

    würde das ganze dann doch deutlich vereinfachen

    Werd wohl doch zu Deiner Lösung greifen. Ist irgendwie im Händeln einfacher, auch wenn das Kopieren ganzer Bäume auch da nicht ganz einfach wird.

    Gruß Mümmel


Anmelden zum Antworten