Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Dubletten mit Relation entfernen...

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Datenkamp, 22 April 2013.

  1. Datenkamp

    Datenkamp Neuer Benutzer

    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 ;)
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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
     
    ukulele gefällt das.
  3. Datenkamp

    Datenkamp Neuer Benutzer

    Danke!!!

    Hat geklappt beim update Statement musste ich noch ein:

    WHERE ab.ta=bla.alt

    anhängen...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden