Ich hab folgendes Problem:
Mit dem Befehl distinct on kann ich doppelte Zeilen einer Abfrage elliminieren. Wie kann ich mir aber genau diese doppelten Zeilen anzeigen lassen? Finde leider nichts in meinem schlauen Handbuch.
Vielen Dank.
Andreas
Ich hab folgendes Problem:
Mit dem Befehl distinct on kann ich doppelte Zeilen einer Abfrage elliminieren. Wie kann ich mir aber genau diese doppelten Zeilen anzeigen lassen? Finde leider nichts in meinem schlauen Handbuch.
Vielen Dank.
Andreas
group by … having count(…) > 1
(ohne distinct das ganze)
Ich krieg’s nicht hin. Ich möchte 3 Spalten einer Tabelle ausgegeben haben, aber nur Datensätze, die in 2 der Spalten übereinstimmen.
Vielleicht habe ich ja Glück und errate Deinen Wunsch richtig:
test=*# select * from ev_man ;
a | b | c
---+---+---
1 | 1 | 1
1 | 1 | 2
1 | 2 | 3
2 | 1 | 2
2 | 2 | 3
3 | 1 | 2
3 | 6 | 3
(7 rows)
test=*# select * from ev_man where a=b or b=c or a=c;
a | b | c
---+---+---
1 | 1 | 1
1 | 1 | 2
2 | 1 | 2
2 | 2 | 3
3 | 6 | 3
(5 rows)
Falls nicht: mir auch egal. Wenn Du Deine Frage besser stellst, bräuchten wir hier nicht raten.
Andreas
Ich versuch’s mal besser zu formulieren: distinct on löscht doppelte Datensätze, die in bestimmten Spalten (die ich benennen kann) übereinstimmen. Genau diese Datensätze möchte ich ausgegeben haben. Im konkreten Fall stimmen diese Datensätze immer in den gleichen Spalten überein, aber nicht Spalte A = Spalte B sondern es gibt 2 Datensätze mit dem gleichen Eintrag in Spalte A und in Spalte B.
A B C
1 2 X
1 2 Y
2 3 X
4 1 Z
In der Ausgabe sollen nur die beiden ersten Datensätze erscheinen, weil sie abgesehen von Spalte C doppelt vorkommen.
Jetzt klarer?
test=*# select * from ev_man ;
a | b | c
---+---+---
1 | 2 | x
1 | 2 | y
2 | 3 | x
4 | 1 | z
(4 rows)
test=*# select * from ev_man where (a,b) in (select a,b from ev_man group by a,b having count(*) > 1);
a | b | c
---+---+---
1 | 2 | x
1 | 2 | y
(2 rows)
Andreas
Oder als JOIN:
test=*# select a.* from ev_man a right join (select a,b from ev_man group by a,b having count(*) > 1) foo on ((a.a, a.b)=(foo.a, foo.b));
a | b | c
---+---+---
1 | 2 | y
1 | 2 | x
(2 rows)
Andreas
Ich weiß immer noch nicht, wie ich’s machen soll.
Meine Abfrage so ungefähr:
select a, b, c from beispiel where c = ‘1234’ or c = ‘1235’;
Und aus diesem select brauche ich die Datensätze, die in a und b übereinstimmen. Irgendwie schnalle ich das nicht.
Danke für die Geduld mit mir.
Das paßt nun aber exakt gar nicht zu dem von Dir genannten Beispiel.
Und aus diesem select brauche ich die Datensätze, die in a und b übereinstimmen. Irgendwie schnalle ich das nicht.
Danke für die Geduld mit mir.
Für Dein gezeigtes Beispiel habe ich Dir 2 Wege gezeigt, um zu dem von Dir genannten Resultat zu kommen.
Nun bin ich es, der etwas nicht schnallt.
Andreas, Feierabend nun habend…
Das genannte Beispiel passt schon, nur das dieses Beispiel schon das Ergebnis eines select ist. Ich möchte es aber umgehen, dieses select erst in eine Tabelle auszugeben. Nach meinem Verständnis (und das ist nicht sehr groß) müsste in dem SQL-Befehl irgendwo noch ein select mehr sein???
Mal ganz allgemein: man kann SQL-Befehle verschachteln und das Resultat eines selects wieder als table-Quelle für ein anderes select verwenden. Mal kurz als Demo:
kretschmer=> select 1 as a union select 2 union select 3;
a
---
1
2
3
(3 rows)
kretschmer=> select min(a), max(a) from (select 1 as a union select 2 union select 3) foo;
min | max
-----+-----
1 | 3
(1 row)
kretschmer=>
Andreas