PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL: Distinct einer Tabelle und mehrfachem SELECT Statement


Gfrast
2007-11-05, 10:40:48
Ich hab ein SQL Statement mit mehrfacher SELECT Abfrage und will aber doppelte Einträge bei einer einzelnen Spalte vermeiden (die anderen Spaltenwerte unterscheiden sich schon)

Bsp:


TblA TblB TblC
A 12345 XY
A 23456 YZ
B 34567 ZY
C 09844 AE

Ich brauch folgende Ausgabe (Geht das überhaupt ohne temporärer Tabelle mittels INTO?)


TblA TblB TblC
A 12345 XY
B 34567 ZY
C 09844 AE

daflow
2007-11-05, 12:14:20
Welche Werte von Tb1B bzw. Tb1C sind gewünscht? Jeweils der niedrigste zum distinct aus Tb1A?

Gast
2007-11-05, 12:16:43
Welche Werte von Tb1B bzw. Tb1C sind gewünscht? Jeweils der niedrigste zum distinct aus Tb1A?

Ist eigentlich egal. Entweder der Niedrigste, oder der Erste.

daflow
2007-11-05, 13:49:14
select a,b,c from abc where b in(select min(b) as b from abc groub by a)

gibt zu einem eindeutigen Wert aus Col a den jeweils niedrigsten Wert b aus + den zum niedrigsten B passenden C Wert, funzt zumindest so unter db2, klappts?

Gast
2007-11-05, 16:49:27
Nö. Jetzt hab ich das Problem, dass mein SQL-Statement bisher so ausgesehen hat und ich nicht weiss, wie ichs umbasteln soll:

select tbla,tblb,tblc from abc where tbla in('A', 'A', 'B', 'C', 'D', 'E', 'E', 'F')

daflow
2007-11-05, 18:24:14
Nö. Jetzt hab ich das Problem, dass mein SQL-Statement bisher so ausgesehen hat und ich nicht weiss, wie ichs umbasteln soll:

select tbla,tblb,tblc from abc where tbla in('A', 'A', 'B', 'C', 'D', 'E', 'E', 'F')

Was bringt
"select tbla,tblb,tblc from abc where tblb in(select min(tblb) as tblb from abc groub by tbla)"
für 'ne Fehlermeldung?


"select tbla,tblb,tblc from abc where tbla in('A', 'A', 'B', 'C', 'D', 'E', 'E', 'F')"
macht so nicht direkt Sinn -> "where tbla in(...)" macht ja folgendes:
Es überprüft ob die Wert die in der Klammer gennant werden für tbla vorkommen sprich "where tbla in ('A','B','C','D','E','F')" hätte die selbe Wirkung würde dir aber noch immer alle Datensätze zurückbringen, weil du ja nur tbla dadurch 'einschränkst'(wobei einschränken hier nicht wirklich passt, denn zu listest darin ja jeden Wert auf der in tbla vorkommen kann -> alle Datensätze werden zurückgegeben).
Der Trick der Sache ist das du also tblb oder tblc so einschränken musst, das pro distinct Wert von tbla nur ein tblb/tblc zurückkommt. Dies geschieht in meinem Vorschlag durch die "min()"-Funktion auf tblb kombiniert mit dem "group by" von tbla. Mit was für einer Datenbanksoftware arbeitest du?

Gfrast
2007-11-06, 08:25:45
Was bringt
"select tbla,tblb,tblc from abc where tblb in(select min(tblb) as tblb from abc groub by tbla)"
für 'ne Fehlermeldung?

Garkeine. ;)

Ich habs nun einfach mit AND an mein bisheriges SQL Statement ("select tbla,tblb,tblc from abc where tbla in('A', 'A', 'B', 'C', 'D', 'E', 'E', 'F')") angehängt und nun funzts. Dankeschön!


"select tbla,tblb,tblc from abc where tbla in('A', 'A', 'B', 'C', 'D', 'E', 'E', 'F')"
macht so nicht direkt Sinn -> "where tbla in(...)" macht ja folgendes:
Es überprüft ob die Wert die in der Klammer gennant werden für tbla vorkommen sprich "where tbla in ('A','B','C','D','E','F')" hätte die selbe Wirkung würde dir aber noch immer alle Datensätze zurückbringen, weil du ja nur tbla dadurch 'einschränkst'(wobei einschränken hier nicht wirklich passt, denn zu listest darin ja jeden Wert auf der in tbla vorkommen kann -> alle Datensätze werden zurückgegeben).
Der Trick der Sache ist das du also tblb oder tblc so einschränken musst, das pro distinct Wert von tbla nur ein tblb/tblc zurückkommt. Dies geschieht in meinem Vorschlag durch die "min()"-Funktion auf tblb kombiniert mit dem "group by" von tbla. Mit was für einer Datenbanksoftware arbeitest du?

Ist mir soweit klar. Blöderweise hat die Liste 340 zT doppelte Einträge und die alle zu durchforsten war mir zu umständlich - bzw. wollt ich sie einfach 1:1 übernehmen können.

BTW: Ich verwende TOAD für Oracle.



Danke nochmal :up: