Vergleich zwischen Spalten.. Wie gehts?

Moin zusammen,

Win2000, MS-SQL 2000, Tabelle mit Kundendaten (Adressen, ID´s etc)

Bin hier leider nur mit rudimentärer SQL-Erfahrung unterwegs, möchte aber eine Tabellenbereinigung mittels SQL durchführen, anstatt die DB erst zu exportieren und dann umständlich auf Excel zu bearbeiten.

Zuerst werden ein paar Abfragen über die Tabelle gejagt um die unnötigen Daten auszusortieren.
Zum Beispiel mit folgenden Anweisungen:

– Alle Dutzenkarten löschen
delete from Besucher
where Kartentyp = (40);

– Alle Jugendlichen löschen
delete from Besucher
where GeburtsDatum > (‚01.05.1989‘);

– Alle Kartenaktivierungen älter 2 Jahre löschen
delete from Besucher
where AbDatum

hi Dominik

üblicherweise kann man das so lösen:

delete from tabelle
where id in (
select a.id from tabelle a, tabelle b
where a.feld1 = b.feld1
and a.feld2 = b.feld2
and a.feld3 = b.feld3
and a.id > b.id );

es gibt vielleicht elegantere lösungen, aber die fallen mir gerade nicht ein…

lg
erwin

Hallo Erwin,

delete from tabelle
where id in (
select a.id from tabelle a, tabelle b
where a.feld1 = b.feld1
and a.feld2 = b.feld2
and a.feld3 = b.feld3
and a.id > b.id );

Ich hab mal mit meinen bescheidenen Kenntnissen versucht hier zu experimentieren, hat aber nicht geklappt. Mein Cheffe meint auch das es nicht klappen kann da Du in Deinem Script mit zwei Tabellen arbeitest ich aber nur eine habe.
Ich versuch nochmal genau die Vorgaben aufzuschreiben - vielleicht kannst Du mir dann genau mit den Vorgaben mal das Script aufschreiben - denn manchmal hab ich auch damit schon Probleme genau zu wissen wo was hinkommt.

Also:
1 Tabelle > Besucher
Insgesamt mehr als 30 Spalten
3 benötigte Spalten > Vorname > Name > Strasse

Eventuell kannst Du Dir ja nochmal ein wenig Zeit nehmen und mir hier etwas helfen…

Gruß - Dominik

Nix Vergleich zwischen Spalten
Hi Dominik,

da Du nur eine Tabelle hast, vergleichst Du keine Spalten, sondern willst nach 3 Spalten gleichzeitig auswählen:

delete from tabelle
where tabelle.Vorname = :vorname
and tabelle.name = :name
and tabelle.strasse = :strasse

Die Werte mit dem Doppelpunkt sind Parameter oder Host-Variablen, da müsstest Du im Handbuch schauen, wie die angegeben werden.

Abgesehen von der Technik: Was machst Du, wenn 2 Leute gleichen Namens in der gleichen Straße wohnen? Die obige Anweisung haut dann alle beide raus.

Gruß Ralf

hi dominik

delete from tabelle
where id in (
select a.id from tabelle a, tabelle b
where a.feld1 = b.feld1
and a.feld2 = b.feld2
and a.feld3 = b.feld3
and a.id > b.id );

ich hatte ehrlich gesagt nicht damit gerechnet, dass man das missverstehen könnte…

da ich weder deinen tabellennamen noch deine spaltennamen kannte, habe ich den namen „tabelle“ für deine tabelle und „feld1“, „feld2“, „feld3“ für deine spalten angenommen.

mit „from tabelle a, tabelle b“ nehme ich die tabelle „tabelle“ zweimal in die from-klausel auf, einmal mit alias „a“ und einmal mit alias „b“. damit kann man in der where-klausel quasi die tabelle mit sich selbst vergleichen.

vieleicht etwas deutlicher: deine tabelle heisst person und du hast duplikate, die du anhang gleichen namen und geburtsdatum erkennst.

die tabelle sieht so aus:
person
id number
vorname varchar
nachname varchar
gebdat date

duplikate löscht du damit so:

delete from person
where id in ( select a.id
from person a, person b
where a.vorname = b.vorname
and a.nachname = b.nachname
and a.gebdat = b.gebdat
and a.id > b.id );

war das jetzt etwas klarer???

lg
erwin