![]() |
Oracle-SQL Frage: Leider fällt mir kein passender Titel zu diesem Problem ein...
Hallo,
ich hab in einer Oracle-Datenbank eine Zustands-Tabelle mit den 16 Zuständen 1, 2, 4, 8, 16, ... 65536. Jede Person hat mindestens einen Eintrag, meist 4 und 4096 mit einem Zeitstempel. Jetzt interessieren mich diese Zeitstempel, aber nur einer pro Person und zwar entweder von Zustand 4, 2, 1, 128 in dieser Reihenfolge. Soll heißen: Gibt es einen Eintrag mit 4 soll der Zeitstempel von dort genommen werden, ansonsten von 2, wenn es den auch nicht gibt von 1 und wenn es den nicht gibt von 128. Sollte es tatsächlich eine Person geben, die keinen dieser vier Zustände hat, interessiert sie mich nicht. Wie kann ich das elegant lösen? Vielen Dank im Voraus für eure Hilfe und schöne Grüße, Nestrus |
entweder du arbeitest zur gewünschten sortierung mit decode oder du nimmst pl/sql ;)
|
PL/SQL kann ich leider nicht wirklich. Ich verstehe auch nicht ganz, wie das mit decode funktionieren soll.
Die Tabelle schaut z.B. so aus: ID | Zustand | Bearbeiter | Zeitstempel | --------------------------------------------- 1........4...........16.............1.10.2009 1........16...........2.............12.10.2009 1........128........11............. 1.1.2010 2........1...........10.............10.2.2009 2........32...........4.............3.6.2009 3........ 2...........16.............1.1.2010 Als Ergebnis soll rauskommen: ID | Zustand | Bearbeiter | Zeitstempel | --------------------------------------------- 1........4...........16.............1.10.2009 2........1...........10.............10.2.2009 3........ 2...........16.............1.1.2010 Ich weiß zwar, wie ich mit decode statt IDs Namen ausgeben kann, aber nicht wie ich das im where verwenden kann, damit die richtigen Zeilen kommen. |
paßt da was mit den ID's nicht oder ist das absicht?
|
Oh, das hätte ich anders benennen sollen, das sind nicht die IDs dieser Tablle sondern die PersonenIDs, hier also Foreign Key.
|
Ich hab probiert decode anstatt wie bisher von mir gewohnt im select in die where-Klausel zu schreiben, aber es kommt nur "invalid identifier":
select personid, bearbeiter, zeitstempel from test where zustand = decode (zustand,4,4,2,2,1,1,128,128); Außerdem hab eich mir case...when angeschaut. Ich dachte, damit könnte ich erreichen, dass bei Zustand 4 diese Zeilen verknüpft werden, ansonsten wenn 2 vorkommt die usw. aber das bringt den gleichen Fehler: select personid, bearbeiter, (case zustand when 4 then zeitstempel when 2 then zeitstempel when 1 then zeitstempel when 128 then zeitstempel else '?' end) from test; Weiß jemand wie es richtig ist? |
select distinct(1), 2,
case zustand when 4 then "1" when 2 then "2" when 1 then "3" when 128 then "4" else "?" end from irgendwo where zustand in (2,4, .. ,128) order by 3; untested, sollte aber - bis auf Syntaxfehler - so passen, wenn auch verdammt grauslich. |
es geht ja um oracle-sql :rolleyes:
ich hab zum testen die tabelle mit folgenden spalten angelegt: ID PERS_ID ZUSTAND BEARBEITER ZEITSTEMPEL und die query funktioniert dann so: Code:
select * |
@pong: Leider verstehe ich den Code nicht wirklich und auch nicht das Ergebnis das rauskommt...
@pc.net: Das verstehe ich auch nicht ganz, aber das Ergebnis schaut genau nach dem aus, was ich wollte! Vielen Dank für die Hilfe! |
ich hab beim copy/paste in der eile leider vergessen die tabellen-namen und die tabellen-aliase anzupassen ... ist oben aber jetzt korrigiert ...
und zur erklärung: mit der decode-funktion wird dem zustands-wert ein anderer wert zugewiesen (bzw. für alle werte, die nicht in der liste aufscheinen, auf 0 gesetzt), um mit der max-funktion die gewünschte reihung simmulieren zu können ... die werte in dieser reihung kann man dann natürlich auch beliebig erweitern bzw. anpassen ... |
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag