Announcement

Collapse
No announcement yet.

DELETE über drei Tabellen? Oder UPDATE?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DELETE über drei Tabellen? Oder UPDATE?

    Hallo zusammen

    Ich habe ein kleines SQL Problem! Ich möchte mehrere Zeilen in drei verschiedenen Tabellen löschen.

    Mit folgendem Query konnte ich zwar die gewünschten Daten aus einer Tabelle löschen, doch war nachher der Inhalt logischerweise weg und ich konnte den Inhalt aus den beiden anderen Tabellen nicht mehr löschen:

    Code:
    DELETE Statistik 
    FROM Statistik,Kasse,Journal
    WHERE (Statistik.TischNr = 1124)
    AND (Statistik.BuchPeriode BETWEEN '01.08.2004' AND '31.08.2004')
    AND (Kasse.BonNr = Journal.BonNr)
    Jetzt bin ich auf die (Blöde?) Idee gekommen, dass ich per UPDATE den Inhalt aller gewünschten Zeilen die ich löschen will zu ändern und später in jeder Tabelle einzeln zu löschen. Die Query's würden dann so aussehen:

    Code:
    UPDATE Statistik
    SET Statistik.BonNr = 999
    FROM Statistik, Kasse, Journal
    WHERE (Statistik.TischNr = 1124)
    AND (Statistik.BuchPeriode BETWEEN '01.08.2004' AND '31.08.2004')
    AND (Kasse.BonNr = Journal.BonNr)
    
    UPDATE 	Kasse
    SET 	Kasse.BonNr = 999
    FROM 	Statistik, Kasse
    WHERE 	Statistik.BonNr = 999
    
    UPDATE 	Journal
    SET 	Journal.BonNr = 999
    FROM 	Statistik, Journal
    WHERE 	Statistik.BonNr = 999
    Beim ersten Query ändert er 122 Zeilen. Das stimmt so auch. Doch beim zweiten Query, in der ich die Kassen Tabelle updaten möchte, ändert er ca. 27000 Zeilen.. Wie kommt denn das? Hab ich irgendeinen logik-Fehler begangen oder Ist mein Query einfach falsch?

    Wäre froh wenn Ihr mir helfen könntet!!

    lg Immi

    P.S.: Schlussentlich möchte ich dann einfach folgende Query's ausführen:

    Code:
    DELETE FROM Statistik WHERE BonNr = 999
    
    DELETE FROM Kasse WHERE BonNr = 999
    
    DELETE FROM Journal WHERE BonNr = 999
    Ah ja, fast vergessen: Das ganze läuft auf einem MS SQL Server 2000!
    Zuletzt editiert von Immi; 22.05.2007, 16:01.

  • #2
    Stichwort ist kaskatierte Löschoperationen und das kannst du beim MS SQL-Server 2000 schon bei der definition der Datenbank erstellen. Damit löscht die Datenbank automatisch die abhängigen Datensätze in anderen Tabellen.

    Comment


    • #3
      und das kannst du beim MS SQL-Server 2000 schon bei der definition der Datenbank erstellen. Damit löscht die Datenbank automatisch die abhängigen Datensätze in anderen Tabellen.
      Die Datenbank besteht bereits, kann ich das auch noch nachträglich erstellen?

      Und was hältst du von der "UPDATE"-Idee??

      lg und Danke

      Comment


      • #4
        Originally posted by Immi View Post
        Die Datenbank besteht bereits, kann ich das auch noch nachträglich erstellen?
        Originally posted by Immi View Post
        Und was hältst du von der "UPDATE"-Idee??
        Gar nichts. Wenn schon dann eine Transaktion starten und die Daten direkt löschen ohne erst auf "Lösch-ID" setzen.

        Comment


        • #5
          Originally posted by Bernhard Geyer View Post
          Gar nichts.
          Aber möglich wäre es?

          Comment


          • #6
            Ok. Deine Where-Bedingungen sind jedesmal falsch.

            Mit der Angabe FROM Statistik, Kasse ist ein Cross-Join, du benötigst aber eine Inner-Join

            Comment


            • #7
              Hab's jetzt mal versucht in JOINS "umzuschreiben".. Doch auch dies geht so nicht:

              Code:
              UPDATE	Statistik
              SET	Statistik.BonNr = 999
              FROM 	Statistik INNER JOIN Kasse
              ON Statistik.BonNr = Kasse.BonNr INNER JOIN Journal
              ON Statistik.BonNr = Journal.BonNr
              WHERE Statistik.BuchPeriode BETWEEN '01.08.2006' AND '31.08.2006'
              AND Statistik.TischNr = 400
              
              UPDATE	Kasse
              SET	Kasse.BonNr = 999
              FROM 	Kasse INNER JOIN Statistik
              ON Kasse.BonNr = Statistik.BonNr INNER JOIN Journal
              ON Statistik.BonNr = Journal.BonNr
              WHERE Statistik.BuchPeriode BETWEEN '01.08.2006' AND '31.08.2006'
              AND Statistik.TischNr = 400
              
              UPDATE	Journal
              SET	Journal.BonNr = 999
              FROM 	Journal INNER JOIN Kasse
              ON Journal.BonNr = Kasse.BonNr INNER JOIN Statistik
              ON Kasse.BonNr = Statistik.BonNr
              WHERE Statistik.BuchPeriode BETWEEN '01.08.2006' AND '31.08.2006'
              AND Statistik.TischNr = 400
              Könntest du mir ein Beispiel machen, wie es richtig wäre? Oder was genau ist denn an diesen Query's falsch? Bin schon fast am verzweifeln..

              Aber danke dir für deine Mühe!

              grüsse Immi

              Ah ja: die BonNr müssen in allen drei Tabellen gleich sein, das hatte ich weiter oben vergessen.

              Comment


              • #8
                Hallo!

                Sieh mal in die Hilfe vom MS Sql Server unter ON DELETE CASCADE
                Bedingung hierfür ist, dass die Tabellen per referentieller Integrität verbunden sind siehe unter FOREIGN KEY in der Hilfe

                Alternativ einen Trigger für die sntsprechende Tabelle einfügen siehe unter CREATE TRIGGER und dort FOR DELETE.

                Die Idee mit dem "Merken" ist dann überflüssig...

                BYE BERND

                Comment

                Working...
                X