Dubletten mit Relation entfernen...

Datenkamp

Neuer Benutzer
Beiträge
2
Hallo Forum,
bin relativ neu was SQL angeht und hoffe Ihr könnt mir schnell helfen.
Habe folgendes Problem:
Habe zwei/drei Daten Tabellen also Zwei die in einer n zu m Beziehung zueinander steht und die dritte die die Beziehen wiederspiegelt.
Jetzt habe ich in der einen Tabelle nennen wir sie B Dubletten da die ich gerne löschen möchten.

Leider haben die Dubletten unterschiedliche ID und werden in der Beziehungstabelle dann falsch verknüpft wenn ich diese Dubletten einfach löschen würde
(Ein Befehl hierfür wäre:

Delete *
FROM dbo.B T
Where T.AddressDataId > (
SELECT MIN(X.AddressDataId)
FROM dbo.B X
WHERE
X.FirstName = T.FirstName AND
X.LastName = T. LastName AND
X.Town = T.Town)

Jetzt möchte ich die Beziehungstabelle zunächst aber so Updaten, das immer die kleinste ID angezeigt wird und ich die “höheren” ID’S ohne folgen löschen kann.
Irgendwie übersteigt das momentan meinen Horizont ;)
 
Werbung:
Hallo Forum,
bin relativ neu was SQL angeht und hoffe Ihr könnt mir schnell helfen.
Habe folgendes Problem:
Habe zwei/drei Daten Tabellen also Zwei die in einer n zu m Beziehung zueinander steht und die dritte die die Beziehen wiederspiegelt.
Jetzt habe ich in der einen Tabelle nennen wir sie B Dubletten da die ich gerne löschen möchten.

Leider haben die Dubletten unterschiedliche ID und werden in der Beziehungstabelle dann falsch verknüpft wenn ich diese Dubletten einfach löschen würde


Du hast also eine Tabelle:

Code:
test=*# select * from a;
 id | val
----+-----
  1 | a1
  2 | a1
  3 | a2
(3 rows)

Und 2 weitere:

Code:
test=*# select * from b;
 id | val
----+-----
  1 | b1
  2 | b2
  3 | b3
(3 rows)

Time: 0,185 ms
test=*# select * from ab;
 ta | tb
----+----
  1 |  1
  2 |  1
  3 |  3
(3 rows)


id 1 und 2 sind gleich, du möchtest aus 2 eine 1 machen um das zu beheben und das soll aber auch in der verbindungstabelle so erfolgen, und zwar zuerst, damit die Fremdschlüssel nicht kapott gehen.

Ändern mußt Du diese Datensätze:

Code:
test=*# select a.id as alt, foo.id as neu from a left join (select val, min(id) as id from a group by val) foo on a.val=foo.val where a.id != foo.id;
 alt | neu
-----+-----
   2 |   1
(1 row)

Also:
Code:
test=*# update ab set ta=bla.neu from (select a.id as alt, foo.id as neu from a left join (select val, min(id) as id from a group by val) foo on a.val=foo.valwhere a.id != foo.id) bla where ta=bla.alt;
UPDATE 1
Time: 25,381 ms
test=*# select * from ab;
 ta | tb
----+----
  1 |  1
  3 |  3
  1 |  1
(3 rows)

Dann kannst Du Tabelle a auch noch updaten, das überlasse ich Dir jetzt mal zur Übung.

Alles mit PostgreSQL gemacht, ist aber einklich alles 0815-SQL.

Andreas
 
Werbung:
Zurück
Oben