# DISTINCT und ORDER BY ??



## Ralph (13. August 2003)

Hi,


ich habe eine Tabelle mit den Spalten OBJ und OE1. OBJ is der Primärschlüssel. in der Spalte OE1 sind Daten drin, die der User eingeben kann.

Nun folgendes. Ich brauche über eine Abfrage, die letzten 5 eingegebenen Felder aus der Spalte OE1. Wobei Doppler rausgeschmissen werden müssen und ich dann dafür halt den an Stelle 6 oder 7 sitzenden Eintrag nehmen würde.

Mein Problem ist das ich mit einer Distinct oder group by Abfrage irgendwie nicht weiterkomme. 

Ich brauche also eine Abfrage ohne Doppler, die die OE1 ausspuckt und die mit "order by OBJ desc" sortiert worden ist.

Wie bitte geht das? ;(

***
Ach ja, ist eine Oracle DB, also Subselects und Views sind kein Problem.


----------



## derGugi (13. August 2003)

das geht nicht?? :
SELECT DISTINCT OE1 FROM tabelle ORDER BY OBJ DESC LIMIT 5


----------



## Ralph (13. August 2003)

Nein, weil dann kommt als Fehler zurück:


```
SQL> SELECT DISTINCT OE1 FROM pot_daten_pers ORDER BY OBJ;
SELECT DISTINCT OE1 FROM pot_daten_pers ORDER BY OBJ
                                                 *
FEHLER in Zeile 1:
ORA-01791: Kein mit SELECT ausgewählter Ausdruck


SQL>
```


Was soviel heisst, dass er die Spalte OBJ nicht sortieren kann, weil ich diese nicht im Ergebnis habe oder so ähnlich. Zumindest versteh ich das so


----------



## derGugi (13. August 2003)

hmm, also mit MySQL geht das. Dann sollte es mit Oracle ja auch funzen... Hab zwar noch nie mit Subqueries gearbeitet, aber hier ne idee: SELECT OE1 FROM (SELECT DISTINCT OBJ,OE1 FROM pot_daten_pers ORDER BY OBJ DESC LIMIT 5);
Keine Ahung, ob das geht. Kenn mich mit subselects überhaupt nicht aus. 
Aber ist schon strub, dass das andere nicht klappt...


----------



## durin (14. August 2003)

Da du ja die letzten 5 OHNE Duplikate willst und der Distinct ja nur für die OE1 gelten soll , müsstest du wohl eher 

SELECT DISTINCT OE1 LIMIT 5 FROM (SELECT OBJ,OE1 FROM pot_daten_pers ORDER BY OBJ DESC);

nehmen.


----------



## Ralph (14. August 2003)

Also ersma kommt Limit nicht vor From oder? 

Und das Statment bringt auch keine gewünschten Erfolg ;(


----------



## durin (14. August 2003)

Sorry, war mit der heissen Nadel gestrickt.

Poste doch mal die Syntax und die zugehörige Fehlermeldung, bzw. das Ergebnis, das die Abfrage bringt.


----------



## Ralph (14. August 2003)

Hier dein Fehlercode 

```
SQL> SELECT DISTINCT OE1 LIMIT 5 FROM (SELECT OBJ,OE1 FROM pot_daten_pers ORDER BY OBJ DESC);
SELECT DISTINCT OE1 LIMIT 5 FROM (SELECT OBJ,OE1 FROM pot_daten_pers ORDER BY OBJ DESC)
                          *
FEHLER in Zeile 1:
ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden
```
Limit gibts auch nciht bei Oracle, hab ich heute gelernt, das is aber nich so wild. Wichtig ist erstmal die Sortierung.


```
SQL> SELECT DISTINCT OE1 FROM (SELECT OBJ,OE1 FROM pot_daten_pers ORDER BY OBJ DESC);

OE1
--------------------------------------------------
ABC
ABS
ACD
BTK
BTL
FT
SE
STAB
ZZZZZ


10 Zeilen ausgewählt.
```



Das ist die Grundlage:


```
SQL> select obj, oe1 from pot_daten_pers where oe1 is not null;

       OBJ OE1
---------- --------------------------------------------------
         1 ABC
         2 BTL
         3 FT
         8 ACD
        11 BTK
        13 BTL
        14 FT
        16 SE
        18 ABS
        22 ZZZZZ
        23 STAB

11 Zeilen ausgewählt.

SQL>
```

Nun brauche ich die letzten 5 Datensätze, ohne Doppler. Sprich in dem Beispiel STAB, ZZZZZ, ABS, SE, FT.

Wenn aber nun Doppler in den letzen 5 Einträgen vorkommen, sollen diese ignoriert werden und der nächste DS soll in betracht gezogen werden.

Das Problem ist, das eine DISTINCT Abfrage nicht sortiert werden kann, bzw. nur nach den Spalten, die auch in der SELECT Anweisung ausgewählt werden. 

Ich werde wohl um eine Funktion oder einen Trigger, der mit ne TEMP Tabelle schreib nicht drumrumm kommen ;(

Nun ja, wenn noch jemand einen Einfall hat, wäre es gut


----------



## Cthulhu (4. September 2003)

*subqueries*

Hallo keine Ahnung, ob du noch Hilfe brauchst.

Mit Subqueries könnte es funktionieren. 
Bsp.

```
Select  haus from tblDorf where dorfid = (select  dorfidfs from tblBundesland where bundeslandname = 'soundso')
```

währe ein Beispiel für ein subquery.

gruss Cthulhu


----------

