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

Sql Abfrage - Doppelte Einträge in einer und zwei Spalten

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von littleman, 28 November 2017.

  1. littleman

    littleman Benutzer

    Hallo Gemeinde,

    habe schon vieles lernen können hier. Jetzt brauche ich wieder mal Unterstützung.

    Tabelle "benutzer"
    Spalten:
    id startnummer name vorname

    1 123456 alfred peter
    2 123457 hans peter
    3 123458 bugs bunny
    4 123459 donald duck
    5 123455 alfred peter
    6 123453 daisy duck
    7 123451 peter schulz

    Die erste Abfrage soll die doppelten Einträge in vorname liefern und mir so anzeigen:

    id startnummer name vorname

    1 123456 alfred peter
    2 123457 hans peter
    4 123459 donald duck
    6 123453 daisy duck

    Die zweite, für mich wichtigere Abfrage, soll schauen ob name und vorname doppelt vorhanden sind. Soll folgendes Ergebnis liefern:

    id startnummer name vorname

    1 123456 alfred peter
    5 123455 alfred peter

    Ich habe es nur mit count und having hinbekommen (vorname>1). Da habe ich nur als Ausgabe

    peter 3
    duck 2
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Deine gezeigten Wunschresultate sind nicht eindeutig, insbesondere die erste Abfrage. Welche Einträge soll es denn anzeigen, wenn es Dopplumngen gibt?

    Code:
    test=*# select * from benutzer ;
     id | nummer |  name  | vorname
    ----+--------+--------+---------
      1 | 123456 | alfred | peter
      2 | 123457 | hans  | peter
      3 | 123458 | bugs  | bunny
      4 | 123459 | donald | duck
      5 | 123455 | alfred | peter
      6 | 123453 | daisy  | duck
      7 | 123451 | peter  | schulz
    (7 Zeilen)
    
    test=*# select * from benutzer where vorname in (select vorname from benutzer group by vorname having count(1) > 1);
     id | nummer |  name  | vorname
    ----+--------+--------+---------
      1 | 123456 | alfred | peter
      2 | 123457 | hans  | peter
      4 | 123459 | donald | duck
      5 | 123455 | alfred | peter
      6 | 123453 | daisy  | duck
    (5 Zeilen)
    
    test=*# select * from benutzer where (name, vorname) in (select name, vorname from benutzer group by name, vorname having count(1) > 1);
     id | nummer |  name  | vorname
    ----+--------+--------+---------
      1 | 123456 | alfred | peter
      5 | 123455 | alfred | peter
    (2 Zeilen)
    
    test=*#
    
     
  3. littleman

    littleman Benutzer

    Die Abfrage sieht super aus und ist genau so wie ich es ausgegeben haben wollte.


    test=*# select * from benutzer where vorname in (select vorname from benutzer group by vorname having count(1) > 1);
    id | nummer | name | vorname
    ----+--------+--------+---------
    1 | 123456 | alfred | peter
    2 | 123457 | hans | peter
    4 | 123459 | donald | duck
    5 | 123455 | alfred | peter
    6 | 123453 | daisy | duck
    (5 Zeilen)

    Diese Ausgabe funktioniert bei mir noch nicht.

    test=*# select * from benutzer where (name, vorname) in (select name, vorname from benutzer group by name, vorname having count(1) > 1);
    id | nummer | name | vorname
    ----+--------+--------+---------
    1 | 123456 | alfred | peter
    5 | 123455 | alfred | peter
    (2 Zeilen)



    bekomme nach "where (name..., ...) einen Fehler.
    An expression of non-boolean type specified in a context where a condition is expected, near ','.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Hrm. Ich verwende PostgreSQL, aber das sieht mir eigentlich nach Standard-SQL aus und nicht nach einer PG-Erweiterung...
     
  5. littleman

    littleman Benutzer

    Ja das ist eine ganz normale MSSQL Abfrage.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Kann denn M$SQL dies korrekt?

    Code:
    test=*# select name, vorname from benutzer group by name, vorname having count(1) > 1;
      name  | vorname
    --------+---------
     alfred | peter
    (1 Zeile)
    
    test=*#
    
     
  7. littleman

    littleman Benutzer

    Danke! Genau das liefert mein Wunschergebnis.
    Kannst du mir erklären was genau die Abfrage macht?

    Aber wenn ich die id und die nummer haben will, geht das nicht. Wie kann ich die Abfrage erweitern?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Sie gruppiert nach Name und Vorname (GROUP BY) und liefert nur die Kombinationen, die mehr als einmal vorkommen (das macht das HAVING).


    Normal. Es sind ja unterschiedliche IDs und Nummern. Wenn die einzelnen ids und Nummern sehen willst, muß Du diese mit aggregieren, in PostgreSQL ginge dies so:

    Code:
    test=*# select name, vorname, string_agg(id::text,',') as ids, string_agg(nummer::text,',') as nummern from benutzer group by name, vorname having count(1) > 1;
      name  | vorname | ids |  nummern  
    --------+---------+-----+---------------
    alfred | peter  | 1,5 | 123456,123455
    (1 Zeile)
    
    test=*#
    
    Diese Aggregatsfunktion, also string_agg(), ist kein SQL-Standard, das wird also Dein M$SQL nicht können. Vielleicht findest Du eine Alternative.
     
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