![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Elite
![]() |
![]() 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
____________________________________
"reden 2 unsinn im wcm forum, meint der dritte is eh offtopic" (Gifty am 14. Apr 2002 um 22:47 in " WCM Rat & Tat Forum > Meinung > Guru, e-Zitate & Off Topic > Kommt ein Mann zum Arzt...") |
![]() |
![]() |
![]() |
#2 |
Aussteiger
![]() |
![]() entweder du arbeitest zur gewünschten sortierung mit decode oder du nimmst pl/sql
![]()
____________________________________
Praktizierender Eristiker No hace falta ser un genio para saber quién dijo eso. Der wirklich faule Mensch ist oft extrem fleißig, denn er will möglichst schnell wieder faul sein. |
![]() |
![]() |
![]() |
#3 |
Elite
![]() |
![]() 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.
____________________________________
"reden 2 unsinn im wcm forum, meint der dritte is eh offtopic" (Gifty am 14. Apr 2002 um 22:47 in " WCM Rat & Tat Forum > Meinung > Guru, e-Zitate & Off Topic > Kommt ein Mann zum Arzt...") |
![]() |
![]() |
![]() |
#4 |
Aussteiger
![]() |
![]() paßt da was mit den ID's nicht oder ist das absicht?
____________________________________
Praktizierender Eristiker No hace falta ser un genio para saber quién dijo eso. Der wirklich faule Mensch ist oft extrem fleißig, denn er will möglichst schnell wieder faul sein. |
![]() |
![]() |
![]() |
#5 |
Elite
![]() |
![]() Oh, das hätte ich anders benennen sollen, das sind nicht die IDs dieser Tablle sondern die PersonenIDs, hier also Foreign Key.
____________________________________
"reden 2 unsinn im wcm forum, meint der dritte is eh offtopic" (Gifty am 14. Apr 2002 um 22:47 in " WCM Rat & Tat Forum > Meinung > Guru, e-Zitate & Off Topic > Kommt ein Mann zum Arzt...") |
![]() |
![]() |
![]() |
#6 |
Elite
![]() |
![]() 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?
____________________________________
"reden 2 unsinn im wcm forum, meint der dritte is eh offtopic" (Gifty am 14. Apr 2002 um 22:47 in " WCM Rat & Tat Forum > Meinung > Guru, e-Zitate & Off Topic > Kommt ein Mann zum Arzt...") |
![]() |
![]() |
![]() |
#7 |
Inventar
![]() |
![]() 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.
____________________________________
\"Ein Gewitter reinigt die Luft\", sagte der Mann, nachdem ein Blitz seine Frau erschlug Nicht klicken! Erstposteralarm/Beschwerde/Kummerkasten Verplattet Geändert von pong (06.03.2010 um 20:22 Uhr). |
![]() |
![]() |
![]() |
#8 |
Aussteiger
![]() |
![]() es geht ja um oracle-sql
![]() ich hab zum testen die tabelle mit folgenden spalten angelegt: ID PERS_ID ZUSTAND BEARBEITER ZEITSTEMPEL und die query funktioniert dann so: Code:
select * from TABELLE t1 where decode(t1.zustand, 4, 4, 2, 3, 1, 2, 128, 1, 0) = (select max(decode(t2.zustand, 4, 4, 2, 3, 1, 2, 128, 1, 0)) from TABELLE T2 where t2.pers_id = t1.pers_id and t2.zustand in (4,2,1,128) ) ; ![]()
____________________________________
Praktizierender Eristiker No hace falta ser un genio para saber quién dijo eso. Der wirklich faule Mensch ist oft extrem fleißig, denn er will möglichst schnell wieder faul sein. Geändert von pc.net (11.03.2010 um 12:29 Uhr). |
![]() |
![]() |
![]() |
#9 |
Elite
![]() |
![]() @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!
____________________________________
"reden 2 unsinn im wcm forum, meint der dritte is eh offtopic" (Gifty am 14. Apr 2002 um 22:47 in " WCM Rat & Tat Forum > Meinung > Guru, e-Zitate & Off Topic > Kommt ein Mann zum Arzt...") |
![]() |
![]() |
![]() |
#10 |
Aussteiger
![]() |
![]() 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 ...
____________________________________
Praktizierender Eristiker No hace falta ser un genio para saber quién dijo eso. Der wirklich faule Mensch ist oft extrem fleißig, denn er will möglichst schnell wieder faul sein. Geändert von pc.net (11.03.2010 um 12:36 Uhr). |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|