Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Unvereinbar?: Left Join und Delete

Empfohlene Antworten

Veröffentlicht

Hallo Leute.

Ich habe mir einen netten Left Join zusammengebaut, der mir Datensätze ausgibt, die die referenzielle Integrität verletzen (Schlampiges DB-Design). Als ich die Datensätze endlich angezeigt bekommen habe hab' ich mich erstmal tierisch gefreut. Bis mir dann aufgefallen ist, daß ich die Datensätze auch löschen muss.

Hat irgendjemand eine einfache Idee, wie ich die Datensätze jetzt löschen kann?

Ich stehe irgendwie auf dem Schlauch!:(

Wie waere es mit einem Subselect. Du bekommst wahrscheinlich u.a. einen PK zurueck in deiner Abfrage. Dann probiere mal folgendes:

DELETE FROM table

WHERE primary_key IN (SELECT p_k ....);

hth

  • Autor

Ahh, verdammich!

Hatte ich auch erst so gedacht, was ich aber vergessen hatte (sowohl bei mir, als auch bei der Fragestellung): Ich habe einen zusammengesetzten Primärschlüssel.

Des hat mir dann auch das Hirn so verdreht!

Ich glaub die einfachste Methode ist die, die kaputte Tabelle ohne Daten zu kopieren, darin die geeigneten Indices anzulegen, und schliesslich alle Daten aus der kaputten Tabelle über eine Abfrage zu übernehmen. Daten die den Index verletzen weden dann nicht übernommen.

  • Autor

@Goos

Nee, anscheinend leider nicht. Theoretisch wäre das ja so wie DerMatze das erklärt hat ja möglich, so funktioniert es aber nur wenn man einen einfach Primärschlüssel hat. Wenn der nämlich zusammengesetzt ist, dann kann ich ja nicht noch einfach ein AND dranhängen und hoffen, daß es funzt, weil "das Zusammengesetzte" beim PK dann ja Fehlen würde.

  • Autor

Schaut folgendermaßen aus:


SELECT
*
FROM
RwgWerte
LEFT JOIN
Rohstier
ON
(rwgwerte.Tierart = Rohstier.TierartNummer)
AND
(rwgwerte.Rohstoff = Rohstier.RohstoffNummer)
WHERE
rohstier.Tierartnummer is Null;
[/PHP]

Falls du nen MSSQL Server hast sollte auch sowas funktionieren:

DELETE RwgWerte FROM
RwgWerte LEFT JOIN Rohstier
ON (rwgwerte.Tierart = Rohstier.TierartNummer)
AND (rwgwerte.Rohstoff = Rohstier.RohstoffNummer)
WHERE (rohstier.Tierartnummer is Null)[/PHP]

ob das allerdings auch auf anderen Systemen klappt weiss ich nicht :)

Goos

  • Autor

Moin!

Ich war gestern den ganzen Tag unterwegs und konnte leider nicht gucken.

@Goos

Nee, des funzt net! Ich greife über die BDE auf eine Paradox-DB zu. Aber funktioniert das echt so auf einem SQL-Server? Ich meine beim DELETE wird ja nicht mal die normale SQL-Syntax eingehalten!?

hi,

kann man in paradox mittels sql strings verketten? dann string dir einen eindeutigen identifizierer aus den einzelfeldern des pk zusammen und benutze den als "einspaltigen pk".

oder existiert der exists-operator?

dann:

delete from rwgwerte where exists 

(select 1 from rohstier 

where rohstier.tierartnummer = rwgwerte.tierartnummer 

and rohstier.rohstoffnummer = rwgwerte.rohstoffnummer)

hth...

Original geschrieben von Pointerman

Nee, des funzt net! Ich greife über die BDE auf eine Paradox-DB zu. Aber funktioniert das echt so auf einem SQL-Server? Ich meine beim DELETE wird ja nicht mal die normale SQL-Syntax eingehalten!?

Habs gerade sogar mal kurz probiert....mit dem Ergebnis: ja der SQL-Server macht das.

Goos

  • Autor

@Alle

Ich habe es aufgegeben das Problem mit einem einzigen SQL-Statement zu lösen. Weil ich in Delphi gearbeitet habe, hab ich das Problem gelöst indem ich einfach die "kaputten" Datensätze selectiert habe und diese dann mit einer Zweiten Abfrage aus der Tabelle gelöscht habe.

Trotzdem allen herzlichen Dank für die Mühen!

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.