# Delete



## shader09 (22. Januar 2008)

Schönen guten Morgchen Leutz.
Hoffe ihr könnt mir irgendwie helfen.
Also ich habe 2 Tabellen (Preis und Tarif). In der Tabelle Tarif ist die ID und die Preisstufe, in der Tabelle Preis ist die Preisstufe und noch andere nicht nennenswerte Felder.
Ich habe jetzt eine bestimmte ID, die muss ich jetzt in der Tabelle Preis suchen und dann löschen. Wie kann ich das anstellen!? Suchen und Finden ist ja kein Problem, aber wie lösche ich die jetzt!? Hoffe dochmal das ich mich verständlich ausgedrückt habe.


```
SELECT Preisstufe.Preis, Tarif.ID
FROM Preisstufe.Preis, Tarif
WHERE (((Preisstufe.Preis)="70") AND ((Tarif.ID)="GAQ"));
```


----------



## meni (22. Januar 2008)

Hey.

Schau dir am besten mal die Dokumentation von MySql an. Ich hab dir mal die passende Seite rausgesucht:

http://dev.mysql.com/doc/refman/5.1/de/delete.html

Dort solltest du eigentlich alles finden. 

Funktioniert mit dem "DELETE FROM ....... WHERE ID = ID ..." Befehl.

Gruß,
meni


----------



## shader09 (22. Januar 2008)

Also müsste ich statts den SELECT einfach DELETE hinschreiben!?
Oder hab ich das falsch vestanden!? Glaube nämlich schon, weil hat
so nicht funktioniert. 


```
DELETE Preisstufe.Preis, Tarif.ID
FROM Preisstufe.Preis, Tarif
WHERE (((Preisstufe.Preis)="70") AND ((Tarif.ID)="GAQ"));
```


----------



## Matze (22. Januar 2008)

```
DELETE FROM Tabellenname WHERE (Bedingung)
```
Weiter kau ichs dir aber nicht vor.

In den Netiquet steht übrigens, dass man auch etwas vorarbeit selber leisten soll. Und sag mir jetzt nicht dass du darüber im I-net nichts gefunden hast, weil dieser Befehl in jedem Anfängertutorial zu finden ist


----------



## shader09 (22. Januar 2008)

Bleib dochma ruhig Matze, hab mich informiert.  Wir können nur nicht so 
schlau sein wie du, und alles gleich beim ersten mal können.
In der Access Hilfe und da ich das net hinbekommen habe, wollte ich mir
hier ein kleinen tip geben lassen. 

So hab deins mal ausprobiert, da kommt dann immer nur diese Fehlermeldung.


> Abfrage benötigt zumindest ein Zielfeld.





```
DELETE
FROM Preisstufe.Preis
WHERE (((Preisstufe.Preis)="70") AND ((Tarif.ID)="GAQ"))
```
;


----------



## Matze (22. Januar 2008)

Ok dann sorry. Aber mal ne Frage: Willst du was aus der Tabelle Preis löschen, benutzt aber in der WHERE Bedingung trozdem ein Feld aus ID?


----------



## shader09 (22. Januar 2008)

Ok dann sorry. Aber mal ne Frage: Willst du was aus der Tabelle Preis löschen, benutzt aber in der WHERE Bedingung trozdem ein Feld aus ID?

Is vielleicth etwas schwer zu verstehen, okay.
Weil der Preis mit mehreren IDs verküpft ist, ich aber nur die Datensätze löschen 
möchte wo der Preis = 70 ist und die ID = GCQ.
Und weil es kein Feld ID in der Tabelle Preis gibt, muss ich doch die beiden
Tabellenspalten verknüpfen und dann weiß ich welchen DAtensatz ich löschen kann.
Oder lieg ich da falsch mit meiner Überlegung!?


----------



## Matze (22. Januar 2008)

Lass mal 
	
	
	



```
AND
```
 und alles danach mal weg (";" zählt nicht)


----------



## shader09 (22. Januar 2008)

Hab das AND weggelassen.
Jetzt kommt aber diese blöde Fehlermeldung;



> Abfrage benötigt zumindest ein Zielfeld.


----------



## shader09 (23. Januar 2008)

Also kann mir keiner bei meinem Problem helfen!?
Trotzdem Danke für die versuche.


----------



## Bernd1984 (23. Januar 2008)

Hallo shader09,

nicht so schnell aufgeben.
Dein SQL und die Beschreibung deines Problem im ersten Post passen nicht ganz zusammen.

So ist deine Beschreibung:
Beispiel:
Tabelle Tarif
ID --- Preisstufe
GAQ -  70
AAA   - 20
BBB  -  30
CCC  - 70

Tabelle Preis
Preisstufe
20
30
70

Der SQL müsste dann aber 
	
	
	



```
SELECT Preis.Preisstufe, Tarif.ID
FROM Preis, Tarif
WHERE (((Preis.Preisstufe)="70") AND ((Tarif.ID)="GAQ"));
```
 lauten. Ausserdem gibt es mehrere Ergebnisse, wenn es in der Tabelle Tarif verschiedene ID's mit gleicher Preisstufe gibt, da es sich bei dem SQL um einen Cross Join handelt. 
Kann in der Tabelle Preis eine Preisstufe doppelt vorkommen oder ist das Feld Preisstufe eindeutig? 
Und die Löschung eines Datensatzes erfolgt nur in der Tabelle Preis, so das es dann keine Daten zu einem Tarif in der Tabelle Preis gibt?


----------



## shader09 (23. Januar 2008)

> Kann in der Tabelle Preis eine Preisstufe doppelt vorkommen oder ist das Feld Preisstufe eindeutig



Ja sie kann doppelt vorkommen, deswegen muss ich ja auch die Verknüpfung zu der anderen Tabeller erstellen. Ansonsten würde ich Preisstufen löschen die noch andere Tarife brauchen bzw benutzen.




> Und die Löschung eines Datensatzes erfolgt nur in der Tabelle Preis, so das es dann keine Daten zu einem Tarif in der Tabelle Preis gibt?



Ja die Löschung erfolgt nur da.


----------



## Bernd1984 (23. Januar 2008)

Hallo shader09,

wenn in der Tabelle Preis eine Preisstufe doppelt vorkommen kann, dann gibt es kein eindeutiges Kriterium um einen Datensatz zu löschen.

Tabelle Preis
Preisstufe
20
70
30
70

In diesem Beispiel würdest du beide Datensätze mit Preisstufe "70" löschen, da das Feld "Preisstufe" ja nicht eindeutig ist. Mit deiner aktuellen DB-Struktur kannst due das Probelm nicht lösen.
Wenn in der Tabelle "Preis" die ID aus der Tabelle "Tarif" der Fremdschlüssel ist, dann geht es. Kannst du deine DB-Struktur der der beiden Tabellen noch mal posten, am besten das Create Table-Statement. 
Welche DB benutzt du?


----------



## shader09 (23. Januar 2008)

> wenn in der Tabelle Preis eine Preisstufe doppelt vorkommen kann, dann gibt es kein eindeutiges Kriterium um einen Datensatz zu löschen.



Es können nicht nur eine Preisstufe doppelt vorkommen, sondern mehrere.
Dadurch das es kein eindeutiges Kriterium gibt, "Bau" ich ja die Verbindung zu der Tabelle Tarife auf.




> Kannst du deine DB-Struktur der der beiden Tabellen noch mal posten, am besten das Create Table-Statement.



Wie komm ich daran!?




> Welche DB benutzt du?



Ist eine Access Datenbank.


----------



## Bernd1984 (23. Januar 2008)

Hallo,



> Ist eine Access Datenbank.


Dann vergiss das mit dem "Create Table-Statement", dachte du hast eine MySql- oder MSSql-DB.


> Es können nicht nur eine Preisstufe doppelt vorkommen, sondern mehrere.
> Dadurch das es kein eindeutiges Kriterium gibt, "Bau" ich ja die Verbindung zu der Tabelle Tarife auf.


 Das ist ja auch ok, aber wie willst du einen Datensatz löschen, wenn z.B. zwei Datensätze dem Kriterium entsprechen?

Eigentlich brauchst du in der Tabelle Preis eine ID und diese ID (und nicht Preisstufe) ist dann der Fremdschlüssel in der Tabelle Tarif.

Tabelle Preis
PID Preisstufe
1 - 20
2 - 70
3 - 30
4 - 70

Tabelle Tarif
TID --- PID
GAQ - 4
AAA   - 1
BBB  - 3
CCC  - 1

Dann kannst du korrekt selektieren und auch löschen.


----------



## Bernd1984 (23. Januar 2008)

Hallo shader09,

so bekommst du dann die gewünschte Ergebnisszeile:

```
SELECT Tarif.TID, Tarif.PID, Preis.Preisstufe
FROM Preis INNER JOIN Tarif ON Preis.PID = Tarif.PID
WHERE (((Tarif.TID)="GAQ") AND ((Preis.Preisstufe)="70"));
```
Hier der entsprechende Delete-Befehl:

```
delete from Preis where Preis.PID in 
(Select Preis.PID
FROM Preis INNER JOIN Tarif ON Preis.PID = Tarif.PID
WHERE (((Tarif.TID)="GAQ") AND ((Preis.Preisstufe)="70")));
```


----------



## shader09 (23. Januar 2008)

Danke für deine 2 Anweisungen, nur leider kann ich nicht einfach in der
Datenbank eine neues Feld anlegen. Da es eine Geschäftsdatenbank ist
und ich nicht darumwurschteln kann. Aber trotzdem Danke für deine Hilfe.
Muss ich es auf einen anderen Weg machen um die gewünschten Daten 
zu löschen.


----------



## Bernd1984 (24. Januar 2008)

Hallo shader09,

wenn die Struktur der Datenbank wirklich so ist, wie ich es verstanden habe: http://www.tutorials.de/forum/1559336-post11.html, da wist du keinen SQL finden, der dir eine Zeile aus der Tabelle Preis löscht, wenn dort mehrere Datensätze mit gleicher Preisstufe existieren. Dann hilft nur manuell die Zeile löschen.


----------

