Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Problem mit SQL und einer Abfrage

Dieses Thema im Forum "Oracle" wurde erstellt von Zarathustra, 25 April 2013.

  1. Zarathustra

    Zarathustra Benutzer

    Hallo alle zusammen : )

    Ich habe ein Problem, sagt ja auch der Titel schon! : )
    Und zwar ist es so, dass ich eine Datenbanktabelle mit mehreren Millionen Daten habe.
    Ich habe sehr viele Benutzer drin und Informationen zu diesen. Manche auch doppelt. Das muss aber auch so bleiben. Nun möchte ich alle Benutzer ausgeben, die gewissen Bedingungen einer anderen Spalte erfüllen.
    Hier ein Beispiel:

    Benutzer Art Zeit ...
    a 1 ...
    a 3 ...
    b 1 ...
    c 4 ...

    Nun besteht mein Problem darin, dass ich alle Benutzer, die Art 1 oder 2 irgendwo berühren ausgeben will. Jedoch nicht diese, die Art 1 oder 2 nirgendwo berühren. Da a in diesem Fall 1 und 3 berührt, will ich den Benutzer trotzdem ausgeben.

    Ich habe wirklich keine Ahnung wie ich daran gehen soll. Ich denke mit CASE sollte man da arbeiten. Weiß aber i-wie nicht, welche Bedingungen ich hier setzen muss. Ich hoffe wirklich, dass mir hier jemand helfen kann. Vielleicht auch nur einen Lösungsansatz liefern. Ich würde mich sehr freuen.

    Beste Grüße
    Zara
     
  2. Tommi

    Tommi Datenbank-Guru

    Hallo Zara,

    ich glaube, die folgende Form (Gruppierung) sollte zu dem von dir gewünschten Ergebnis führen (ich beherrsche allerdings nicht die spezielle Oracle-Syntax):

    Code:
    SELECT Benutzer
    FROM Tabelle
    WHERE Art=1 OR Art=2
    GROUP BY Benutzer
    Viele Grüße,
    Tommi
     
  3. Zarathustra

    Zarathustra Benutzer

    Hi Tommi,

    danke für deine Antwort. Das hatte ich auch schon ausprobiert. Das Problem hier ist, dass dann Benutzer a nur bei Art 1 ausgegeben wird, aber nicht bei Art 3.
    Ich möchte, dass der Benutzer ausgegeben wird, solange nur 1 oder 2 berührt. Wenn er das getan hat, soll der gleiche Nutzer auch bei 3, 4, 5 und 6 ausgegebn werden. Wenn er 1 oder 2 jedoch nie in diesem Datensatz berührt, dann soll er nicht ausgegeben werden.

    Danke nochmal vielmals!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    select distinct benutzer from tabelle where art in (1,2)
     
  5. Zarathustra

    Zarathustra Benutzer

    Danke, das probiere ich gleich mal aus! : ) Melde mich gleich wieder!
     
  6. Tommi

    Tommi Datenbank-Guru

    Hallo Zara,

    die Anforderung muss ich jetzt erst mal verstehen.

    Es sollen alle Zeilen aus besagter Tabelle ausgegeben werden, wenn ein Benutzer irgendwo einmal entweder die Art 1 oder die Art 2 angegeben hat? Ist das korrekt?
     
  7. Zarathustra

    Zarathustra Benutzer

    Genau, solange er einmal Art 1 oder 2 ausgewählt hat, soll sein ganzer Datensatz, also auch Art 4 und 5 ausgegeben werden, wenn nicht...dann soll er auch nicht ausgegeben werden.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Dann pack die erste Angabe in ein Subselect, welches Dir den benutzer gibt wo art in (1,2) ist, und frage erneut ab.
     
  9. Tommi

    Tommi Datenbank-Guru

    OK, das ist dann eher über eine zweifache Abfrage zu ermitteln. Zunächst ermittelt man die Benutzer, bei denen die Arten vorhanden sind, dann bezieht man dieses Ergebnis auf die Gesamt-Tabelle und wählt alle Zeilen der Benzutzer aus, die in der ersten Abfrage als Ergebis zurückkommen.

    Könnte wie folgt aussehen:
    Code:
     SELECT *
    FROM Tabelle
    WHERE Benutzer IN
    (SELECT Benutzer
    FROM Tabelle
    WHERE Art=1 OR Art = 2
    GROUP BY Benutzer)
    
    Viele Grüße,
    Tommi
     
  10. Zarathustra

    Zarathustra Benutzer

    Hmm, vielen Dank, aber das verstehe ich nicht so ganz. Habe erst vor einer Woche mit sql angefangen. Merkt man bestimmt^^ Ich habe das jetzt so, klappt aber trotzdem nicht wirklich:

    SELECT DISTINCT Benutzer, Art, Zeit
    FROM Datensatz
    WHERE type in ('1', '2')
    ORDER BY Benutzer
     
  11. Tommi

    Tommi Datenbank-Guru

    Also genau so, wie von Andreas beschrieben :)
     
    akretschmer gefällt das.
  12. Zarathustra

    Zarathustra Benutzer

    Ok, ich versuchs mal, vielen Dank für eure Hilfe! WIRKLICH! : )
     
  13. akretschmer

    akretschmer Datenbank-Guru

    Du kannst es auch so machen, wie von Tommi beschrieben.
     
  14. Tommi

    Tommi Datenbank-Guru

    Hallo Zara,

    bei der Menge der von dir angegebenen Datensätze ist mein Beispiel durchaus verbesserungsfähig, was die Performance angeht.
    Ich kann hier jetzt nur mit der Syntax des SQL Servers von MS dienen, aber das läßt sich sicher auch bei Oracle irgendwie anwende.

    Meine bevorzugte Syntax wäre dann nur ähnlich wie die vorherige:

    Code:
    SELECT *
    FROM Datensatz D
    WHERE EXISTS (SELECT Benutzer FROM
    Datensatz H
    WHERE H.Benutzer=D.Benutzer
    AND (H.Art=1 OR H.Art=2) )
    Unterschied ist der, dass bei der ersten Abfrage-Syntax ein Subselect gemacht wird, der ALLE Datensätze der Tabelle berücksichtigt.
    In der Abfrage über EXISTS wird das Subselect unterbrochen (einfach formuliert), sobald eine Zeile zurückgegeben werden kann.
    Dies ist laut Theorie schneller als der vorher beschriebene Weg.

    Das Funktioniert natürlich nochmals wesentlich besser, wenn entsprechende Indizes gesetzt sind.


    Viele Grüße,
    Tommi
     
  15. Zarathustra

    Zarathustra Benutzer

    Stark, vielen Dan Tommi.
    Ich werde mir den zweiten Code auch nochmal anschauen, vielleicht kriege ich das auch i-wie hin. Den ersten habe ich jetzt ausgeführt. Funktioniert soweit ganz gut...jedenfalls mit nem row-limit! ; )

    Vielen Dank nochmal. Ich schau mir das jetzt hier nochmal ein bisschen an und hab bestimmt später nochmal eine Frage dazu! : )

    *Meine Retter* : ) : ) : )
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden