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

littleman

Benutzer
Beiträge
8
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
 
Werbung:
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=*#
 
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 ','.
 
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=*#
 
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?
 
Werbung:
Danke! Genau das liefert mein Wunschergebnis.
Kannst du mir erklären was genau die Abfrage macht?

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

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


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.
 
Zurück
Oben