WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 04.03.2010, 11:31   #1
Nestrus
Elite
 
Registriert seit: 01.07.2000
Alter: 41
Beiträge: 1.400


Nestrus eine Nachricht über ICQ schicken
Standard 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
____________________________________
"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...")
Nestrus ist offline   Mit Zitat antworten
Alt 04.03.2010, 11:35   #2
pc.net
Aussteiger
 
Benutzerbild von pc.net
 
Registriert seit: 07.10.2001
Ort: Nettistan
Beiträge: 12.997

Mein Computer

Standard

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.
pc.net ist offline   Mit Zitat antworten
Alt 04.03.2010, 14:20   #3
Nestrus
Elite
 
Registriert seit: 01.07.2000
Alter: 41
Beiträge: 1.400


Nestrus eine Nachricht über ICQ schicken
Standard

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...")
Nestrus ist offline   Mit Zitat antworten
Alt 04.03.2010, 15:16   #4
pc.net
Aussteiger
 
Benutzerbild von pc.net
 
Registriert seit: 07.10.2001
Ort: Nettistan
Beiträge: 12.997

Mein Computer

Standard

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.
pc.net ist offline   Mit Zitat antworten
Alt 04.03.2010, 16:20   #5
Nestrus
Elite
 
Registriert seit: 01.07.2000
Alter: 41
Beiträge: 1.400


Nestrus eine Nachricht über ICQ schicken
Standard

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...")
Nestrus ist offline   Mit Zitat antworten
Alt 05.03.2010, 13:36   #6
Nestrus
Elite
 
Registriert seit: 01.07.2000
Alter: 41
Beiträge: 1.400


Nestrus eine Nachricht über ICQ schicken
Standard

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...")
Nestrus ist offline   Mit Zitat antworten
Alt 06.03.2010, 20:18   #7
pong
Inventar
 
Benutzerbild von pong
 
Registriert seit: 25.12.2000
Alter: 41
Beiträge: 9.063

Mein Computer

pong eine Nachricht über ICQ schicken
Standard

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).
pong ist offline   Mit Zitat antworten
Alt 08.03.2010, 12:04   #8
pc.net
Aussteiger
 
Benutzerbild von pc.net
 
Registriert seit: 07.10.2001
Ort: Nettistan
Beiträge: 12.997

Mein Computer

Standard

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)
                  )
                ;
sorry, hat zwar etwas länger gedauert, aber dafür haben mein kollege und ich das problem gelöst und die lösung auch getestet
____________________________________
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).
pc.net ist offline   Mit Zitat antworten
Alt 10.03.2010, 18:56   #9
Nestrus
Elite
 
Registriert seit: 01.07.2000
Alter: 41
Beiträge: 1.400


Nestrus eine Nachricht über ICQ schicken
Standard

@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...")
Nestrus ist offline   Mit Zitat antworten
Alt 11.03.2010, 12:29   #10
pc.net
Aussteiger
 
Benutzerbild von pc.net
 
Registriert seit: 07.10.2001
Ort: Nettistan
Beiträge: 12.997

Mein Computer

Standard

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).
pc.net ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:56 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag