theoberlin
Goto Top

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

Content-ID: 1196337338

Url: https://administrator.de/contentid/1196337338

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

GrueneSosseMitSpeck
GrueneSosseMitSpeck 26.08.2021 aktualisiert um 09:48:50 Uhr
Goto Top
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
ukulele-7
ukulele-7 26.08.2021 um 09:49:00 Uhr
Goto Top
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?
theoberlin
theoberlin 26.08.2021 aktualisiert um 09:57:25 Uhr
Goto Top
den Join hab ich im implizit syntax mit dem ","

Dein Befehl listet auf jeden Fall zu viele Einträge auf.

Ich mache folgendes:

Es gibt eine Tabelle "dbo.Production" dort suche ich nach einem Namen und erhalte eine ID.
Diese ID suche ich in der Tabelle "dbo.Season" und kombiniert mit einer vorgegebenen "Number" erhalte ich eine Seasonid als GUID->@Seasonguid.

Nun möchte ich alle Einträge in der dbo.project mit der "SeasonId" = @seasonguid löschen was wegen verschiedenen Abhängigkeiten nicht möglich ist.

Eine der Abhängigkeiten ist, dass in der dbo.dialogeditor auf die dbo.project referenziert wird. Diese muss ich zuerst löschen.

Tabelle B (dbo.dialogeditor) hat keine eigenen Index sondern enthält nur die Schlüssel aus dbo.project und dbo.user zugeordnet.
em-pie
em-pie 26.08.2021 um 10:17:27 Uhr
Goto Top
Moin,

also eigentlich ist das WWW voll mit Beispielen

DELETE mt
FROM myTable as MT
INNER JOIN JustAnotherTable as JAT 
 on MT.GUID = jat.fGUID
WHERE jat.myRow = 'someSh!t'  

Mit der nur dir bekannten Tabellenstruktur solltest du das nun selbst lösen können....

Gruß
em-pie
ukulele-7
ukulele-7 26.08.2021 um 10:37:19 Uhr
Goto Top
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:
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.
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.
theoberlin
theoberlin 26.08.2021 um 11:05:33 Uhr
Goto Top
Hallo ukulele,

entschuldige, ich versuchs mal an deinen Beispielen:

dbo.production -> passt

TABLE dbo.Season (
ID PRIMARY KEY,
ProductionID FOREGIN KEY REFERENCES dbo.Production(ID),
Number int
)

TABLE dbo.project(
ID PRIMARY KEY,
Seasonid FOREIGN KEY REFERENCES dbo.Season(Seasonid)
)

TABLE dbo.dialogeditor(
PRIMARY KEY REFERENCES dbo.project(ID)
PRIMARY KEY REFERENCES dbo.user --vermutlich gar nicht relevant? (Ist egal listet nur Benutzer der zugewiesen ist)
)


@em-pi
Das Beispiel habe ich gefunden, steige aber nicht durch wieso ich nur einer Where Condition habe.
em-pie
Lösung em-pie 26.08.2021 um 11:39:48 Uhr
Goto Top
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..

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ß
ukulele-7
Lösung ukulele-7 26.08.2021 aktualisiert um 11:45:55 Uhr
Goto Top
Schritt 1
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

)
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!
theoberlin
theoberlin 26.08.2021 um 12:38:23 Uhr
Goto Top
Hallo zusammen,

ja absolut richtig. bei SQL hab ich noch ein bisschen was vor mir..Danke erstmal ist teste das.

lg
Theo
theoberlin
theoberlin 26.08.2021 um 13:17:04 Uhr
Goto Top
Alles klar danke euch! Ich arbeite mich mal komplett durch aber es läuft erstmal!