Records und child records löschen

Rambo21

Aktiver Benutzer
Beiträge
37
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.851
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

[ snip ]

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

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
 

Rambo21

Aktiver Benutzer
Beiträge
37
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
 

akretschmer

Datenbank-Guru
Beiträge
9.851
@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,

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.
 

ukulele

Datenbank-Guru
Beiträge
4.702
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.
 

Rambo21

Aktiver Benutzer
Beiträge
37
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
 
Werbung:

PLSQL_SQL

SQL-Guru
Beiträge
176
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
 
Oben