Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Records und child records löschen

Dieses Thema im Forum "Oracle" wurde erstellt von Rambo21, 1 Februar 2013.

  1. Rambo21

    Rambo21 Aktiver Benutzer

    Hallo Community,
    ich habe ein Problem, ist sehr wichtig. D.h. Hier darf kein Fehler passieren.
    Wir erfassen in der Firma unsere Aufwände in einem Webbasierten Tool, welche im Hintergrund eine Oracle Datenbank hat.
    d.h. Arbeitspaket X = 10 Stunden, Arbeitspaket Y = 20 Stunden, Arbeitspaket Z = 5 Stunden, Arbeitspaket A = 0 Stunden, Arbeitspaket B = 0 Stunden
    Mir geht es nun darum, dass die Arbeitspakete A und B, die 0 Stunden haben, gelöscht werden sollen. Diese werden ebenfalls in der DB angelegt, was die DB unnötig aufbläht
    Ich möchte die 0-Records löschen

    Zunächst zur Struktur:
    - Ich erstelle einen Arbeitszeitnachweis, dies wird in der Tabelle TM_TIME_SHEETS (TTS) angelegt
    Pr. Key = time_sheet_id

    - Im Arbeitszeitnachweis sind dann Informationen der Zeile enthalten, diese werden in der Tabelle TM_TIME_SHEET_LINES (TTSL) angelegt. Für jedes Zeile ein Record, in meinem Bsp. 5 Zeilen (X, Y, Z, A, B)
    Pr. Key = time_sheet_line_id; foreign key = time_sheet_id (aus der Tabelle TM_TIME_SHEETS)

    - Es wird für jede time sheet line zwei Zeilen in der Tabelle TM_ACTUALS (TA) angelegt
    Pr. Key = actuals_id; foreign key = time_sheet_line_id (aus der Tabelle TM_TIME_SHEET_LINES)

    - und schließlich werden die Stunden in der Tabelle TM_ACTUALS_EFFORT (TAE) angelegt
    Pr. Key = actuals_id; foreign key = actuals_id (aus der Tabelle TM_ACTUALS)

    Datenmäßig sieht es so aus - ich poste hier nur die notwendigen Daten
    TM_TIME_SHEETS: -> ein Record, also ein Arbeitszeitnachweis
    select * from tm_time_sheets where time_sheet_id = 31629
    TIME_SHEET_ID = 31629

    TM_TIME_SHEET_LINES: -> 15 Records, also hat der Mitarbeiter 15 Arbeitspakete in seinen Arbeitszeitnachweis hinzugefügt
    select * from tm_time_sheet_lines where time_sheet_id = 31629;
    TIME_SHEET_LINE_ID = 40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, 40269, 40270, 40271, 40272, 40273
    TIME_SHEET_ID = 31629

    TM_ACTUALS: -> 30 Records, pro Time_sheet_line 2 Records
    select * from tm_actuals where time_sheet_line_id in (40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, 40269, 40270, 40271, 40272, 40273);
    ACTUALS_ID = 50474, 50475, 50476, 50477, 50478, 50479, 50480, 50481, 50482, 50483, 50484, 50485, 50486, 50487, 50488,
    50489, 50490, 50491, 50492, 50493, 50494, 50495, 50496, 50497, 50498, 50499, 50500, 50501, 50502, 50503
    TIME_SHEET_LINE_ID = 40259 (für ACTUALS_ID = 50474, 50475), 40260 (für ACTUALS_ID = 50476, 50477...usw.), 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, 40269, 40270, 40271, 40272, 40273
     
    TM_ACTUALS_EFFORT: 30 x 7 = 210 Records, also pro actuals_id 7 Records
    Wenn ich 5 Stunden auf ein Arbeitspaket erfasse, dividiert das Tool durch 5 und schreibt Montag = 1, Di = 1, Mi = 1, Do = 1, Fr = 1, Sa = 0, So = 0 -> Sa und So arbeiten wir nicht :)
    jede actuals_id kommt siebenmal vor
    ACTUALS_ID = 50474, 50475, 50476, 50477, 50478, 50479, 50480, 50481, 50482, 50483, 50484, 50485, 50486, 50487, 50488,
    50489, 50490, 50491, 50492, 50493, 50494, 50495, 50496, 50497, 50498, 50499, 50500, 50501, 50502, 50503

    Nun wurden manche Zeilen einfach aus der Favoritenliste übernommen (Favoritenliste hat z.B. 15 Arbeitspakete) und auf 3 Arbeitspakete wurden Zeiten eingegeben aber in den restlichen 12 wurde nichts eingegeben, was so viele unnötige Records in der DB erzeugt.
    Ich will nun diese 0-Records entfernen.

    Wie schreibe ich so ein Delete-Statement? Also die Child-Records aus TM_ACTUALS_EFFORT, TM_ACTUALS und TM_TIME_SHEET_LINES sollen gelöscht werden. Und es sollen natürlich ALLE 0-Records gelöscht werden, nicht bezogen auf das obige Bsp.
    Danke euch im Voraus und LG,
    Ram
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ich versteh nicht wirklich, was da passiert und was die Logic dahinter ist. Wenn Du Master -> Detail - Tabellen hast und in den Detailtabellen unsinnige Records, dann kannst diese doch erst mal löschen. Wenn in Master-Tabellen Records sind, die keine Einträge in den Details haben, so sind diese auch leicht findbar und damit löschbar.

    Andreas
     
  3. Rambo21

    Rambo21 Aktiver Benutzer

    hallo,
    danke für die Antwort. wenn ich dich richtig verstanden habe:
    1- ich lösche zuerst alle records aus der tabelle tm_actuals_effort, effort = 0 haben. -> OK
    2- dann lösche ich aus der oberen tabelle tm_actuals alle records, die in tm_actuals_effort keine child_records haben. -> OK
    3- schliesslich lösche ich alle records aus der tm_time_sheet_lines, die keine child records in tm_actuals haben.
    hört sich plausibel an..
    @1: wenn ich auf ein Arbeitspaket 5 std. erfasse, wird es in der db so angelegt: day 0(montag)=1, 1(di)=1, 2(mi)=1, 3=1, 4=1, 5(sa)=0, 6(so)=0. ich möchte nun samstag und sonntag natürlich nicht löschen. wenn ich sage #delete * from tm_actuals_effort where effort = 0# dann lösche ich auch die samstage und sonntage. die haben ja immer 0 std und die, die von mo bis fr einen wert haben,
    dürfen natürlich nicht gelõscht werden. da muss ich glaube ich noch sagen #and day != 5 or day != 6. in dem fall lõscht er aber auch die sa und so nicht, die keine werte am mo, di, etc..haben. da muss ich glaube ich einen vergleich ziehen, z.b. wenn montag 0 ist dann löschen, oder so ..


    die Fragen kommen so weil ich nicht allzu lange sql mache.

    dankefür die unterstützung.

    lg,
    ram
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Warum speicherst das einklich so krude? Tut doch nicht Not, oder?

    Speichere doch einfach 5 Stunden auf das Arbeitspaket. fertig. Den Rest machst Du, wenn Du es so braucht, via SELECT oder später in der Anwendung.
     
  5. ukulele

    ukulele Datenbank-Guru

    Wenn ich das richtig verstehe stehen dort day0 bis day6 alle als Spalte in einem Datensatz. Du musst dann nicht day != 5 or day != 6 sagen sondern and day5 = 0 and day6 = 0 und nur dann bleiben Einträge für SA und SO erhalten.
     
  6. Rambo21

    Rambo21 Aktiver Benutzer

    hallo,

    also so sieht es z.b. aus in der tabelle tm_actuals_effort

    actuals_id effort day
    12345 1 0
    12345 1 1
    12345 1 2
    12345 1 3
    12345 1 4
    12345 0 5
    12345 0 6
    67890 0 0
    67890 0 1
    67890 0 2
    67890 0 3
    67890 0 4
    67890 0 5
    67890 0 6

    wenn ich jetzt sage: lösche alle effort = 0 dann löscht er auch von 12345 den day = 5 und 6. wie kann ich das abfangen? k.a. wenn von montag der effort != 0 dann lösche alle zeilen die die actuals_id von dem montag sind..

    hoffe
     
  7. ukulele

    ukulele Datenbank-Guru

    Code:
    DELETE
    FROM    tm_actuals_effort
    WHERE    effort = 0
    AND        [day] != 5
    AND        [day] != 6
     
  8. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Hy,

    ich stelle mal eine blöde Frage....

    Warum speicherst du das überhaupt so in der Tabelle und nicht einfach den Timestamp an welchem das Arbeitspaket gültig ist.
    Von mir aus mit Beginn und Ende INNERHALB einer Woche....

    Denn aus einem Timestamp kannst du dir auch ziehen, welcher Wochentag dies damals war....

    z.B.:
    Code:
    select to_char(sysdate,'D') from dual;
    
    LG
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden