SQL Befehl für delete und Join
Hallo zusammen,
ich stehe gerade vor folgender Frage die für euch bestimmt leicht zu lösen ist aber ich komme nicht weiter.
Ich muss in einer Tabelle eine Zeile löschen die an eine Zeile in einer anderen Tabelle geknüpt ist. Mein SELECT Befehl mit JOIN klappt auch:
select * from dbo.DialogEditor,dbo.Project where id = ProjectId and SeasonId = @seasonguid
Die Aufgabe ist also:
Die IDs zu finden die in dbo.Project im Feld SeasonId den GUID @seasonguid enthält.
Dann in der dbo.DialogEditor die Zeilen zu löschen die als ProjectId die ID enthält.
Ich kriege diesen aber nicht sauber in ein delete Statement. Gelöscht werden muss in Tabelle dbo.DialogEditor.
lg
Theo
ich stehe gerade vor folgender Frage die für euch bestimmt leicht zu lösen ist aber ich komme nicht weiter.
Ich muss in einer Tabelle eine Zeile löschen die an eine Zeile in einer anderen Tabelle geknüpt ist. Mein SELECT Befehl mit JOIN klappt auch:
select * from dbo.DialogEditor,dbo.Project where id = ProjectId and SeasonId = @seasonguid
Die Aufgabe ist also:
Die IDs zu finden die in dbo.Project im Feld SeasonId den GUID @seasonguid enthält.
Dann in der dbo.DialogEditor die Zeilen zu löschen die als ProjectId die ID enthält.
Ich kriege diesen aber nicht sauber in ein delete Statement. Gelöscht werden muss in Tabelle dbo.DialogEditor.
lg
Theo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1196337338
Url: https://administrator.de/contentid/1196337338
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
10 Kommentare
Neuester Kommentar
du beschreibst leider nicht was du da machst... und einen Join Befehl sehe ich uach nicht (der SQL Server macht dann einen Cross join und damit machst du den Cache kaputt)
delete from Dialogeditor where SeasonID in ( select @seasonguid from DialogEditor where projectID = ID)
edit ID muß man entweder hinschreiben oder man macht das als TSQL und definiert das vorher als Variable
delete from Dialogeditor where SeasonID in ( select @seasonguid from DialogEditor where projectID = ID)
edit ID muß man entweder hinschreiben oder man macht das als TSQL und definiert das vorher als Variable
Das ist wirklich etwas ungenau, wie genau sind die "verknüpft"? Vermutlich möchtest du einen Eintrag in Tabelle A löschen aber es gibt in Tabelle B einen Foreign Key der auf A zeigt?
Dann wäre wichtig zu wissen:
- Ist das auch mit Foreign Key Constraint angelegt worden (siehe Tabelle B - Constraints)?
- Steht in der Definition des Foreign Key Constraint irgend etwas von DELETE ON CASCADE?
Dann wäre wichtig zu wissen:
- Ist das auch mit Foreign Key Constraint angelegt worden (siehe Tabelle B - Constraints)?
- Steht in der Definition des Foreign Key Constraint irgend etwas von DELETE ON CASCADE?
Sry es ist unmöglich aus deinen Angaben schlau zu werden weil aus deinem Join nicht hervorgeht welche Spalte aus welcher Tabelle stammt (genannt werden id,ProjectId und SeasonId), da kann man nur vermuten aber nicht wissen. Besser wäre eine explizite Syntax tabelle.spalte. Und weil der Zusammenhang zwischen dbo.dialogeditor dbo.project, dbo.user mit dbo.season nicht klar ist, auch hier fehlen Spaltennamen.
Ich lese folgendes:
Soweit noch relativ klar. Aber einen Primary Key kennen wir nicht oder gibt es nur einen Eintrag und Seasonguid ist gleichzeitig PK?
Hier muss vermutlich zuerst gelöscht werden.
Ich lese folgendes:
TABLE dbo.Production (
ID PRIMARY KEY,
Name --enthält Suchwort
)
TABLE dbo.Season (
Seasonguid PRIMARY KEY,
ID FOREGIN KEY REFERENCES dbo.Production(ID),
Number ???
)
TABLE dbo.project(
??? PRIMARY KEY,
Seasonguid FOREIGN KEY REFERENCES dbo.Season(Seasonguid)
)
Soweit noch relativ klar. Aber einen Primary Key kennen wir nicht oder gibt es nur einen Eintrag und Seasonguid ist gleichzeitig PK?
TABLE dbo.dialogeditor(
??? FOREIGN KEY REFERENCES dbo.project(???)
??? FOREIGN KEY REFERENCES dbo.user(???) --vermutlich gar nicht relevant?
)
Hier muss vermutlich zuerst gelöscht werden.
Zitat von @GrueneSosseMitSpeck:
du beschreibst leider nicht was du da machst... und einen Join Befehl sehe ich uach nicht (der SQL Server macht dann einen Cross join und damit machst du den Cache kaputt)
Naja also den Cache macht er nicht "kaputt". Einen Join hat er, die Join Condition ist vermutlich id = ProjectId wobei aus oben genannten Gründen beide Spalten auch in der selben Tabelle stehen könnten dann wäre es ein CROSS JOIN.du beschreibst leider nicht was du da machst... und einen Join Befehl sehe ich uach nicht (der SQL Server macht dann einen Cross join und damit machst du den Cache kaputt)
Zitat von @GrueneSosseMitSpeck:
delete from Dialogeditor where SeasonID in ( select @seasonguid from DialogEditor where projectID = ID)
Sry aber Grütze, @seasonguid ist eine Variable im Sub-Select, wird also mehrfach zurück gegeben unabhängig davon was in der Tabelle steht.delete from Dialogeditor where SeasonID in ( select @seasonguid from DialogEditor where projectID = ID)
Zitat von @theoberlin:
@em-pi
Das Beispiel habe ich gefunden, steige aber nicht durch wieso ich nur einer Where Condition habe.
Dann fehlt es dir an SQL-Grundlagen..@em-pi
Das Beispiel habe ich gefunden, steige aber nicht durch wieso ich nur einer Where Condition habe.
DELETE mt
FROM myTable as MT
INNER JOIN JustAnotherTable as JAT
on mt.GUID = jat.fGUID
WHERE jat.myRow = 'someSh!t'
- Zeile 2 : Hier wählst du deine Basistabelle aus
- Zeile 3: Hier wählst du eine zu verknüpfende Tabelle aus
- Zeile 4: Hier gibst du an, welche Schlüsselfelder der Tabelle myTable zur Tabelle JustAnotherTable gehören. Die müssen in keiner Primär-Fremdschlüsselbeziehung stehen
- Zeile 5: Das WHERE bezieht sich auf ALLE eingebundenen Tabellen und muss nicht für jede Tabelle einzeln geschrieben werden
Hinweise
- Zeile 3 + 4 könnte auch in einer Zeile stehen, das ist eher eine kosmetische Geschichte.
- Zeile 3 + 4 wiederholen sich, wenn du weitere Tabellen verknüpfen willst
Spiele hier einmal ein wenig herum, bevor du dir alle deine produktiven Tabellen löscht:
https://www.w3schools.com/sql/sql_join.asp
Gruß
Schritt 1
Untereinträge in DialogEditor löschen:
Schritt 2
Eintrag aus Project löschen:
Jetzt kann man das natürlich noch eleganter machen aber in einem Schritt geht es nur unter sehr konkreten Voraussetzungen (DELETE ON CASCADE z.B.) und mit Variablen wird es scheitern wenn z.B. mehrere Einträge in Production oder Season die Kriterien erfüllen.
Bitte mit SELECT * statt DELETE vorher kontrollieren was da gelöscht wird!
Untereinträge in DialogEditor löschen:
DELETE
FROM dbo.DialogEditor
WHERE DialogEditor.ProjectID IN (
SELECT Project.ID
FROM dbo.Production
INNER JOIN dbo.Season
ON Production.ID = Season.ProductionID
INNER JOIN dbo.Project
ON Season.ID = Project.SeasonID
WHERE Production.Name = 'Suchwort'
AND Season.Number = 666 --vorgegebene Nummer
)
Schritt 2
Eintrag aus Project löschen:
DELETE
FROM dbo.Project
WHERE Project.SeasonID IN (
SELECT Season.ID
FROM dbo.Production
INNER JOIN dbo.Season
ON Production.ID = Season.ProductionID
WHERE Production.Name = 'Suchwort'
AND Season.Number = 666 --vorgegebene Nummer
)
Bitte mit SELECT * statt DELETE vorher kontrollieren was da gelöscht wird!