Problem mit SQL und einer Abfrage

Zarathustra

Benutzer
Beiträge
11
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
 
Werbung:

Tommi

Datenbank-Guru
Beiträge
289
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
 

Zarathustra

Benutzer
Beiträge
11
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!
 

Tommi

Datenbank-Guru
Beiträge
289
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?
 

Zarathustra

Benutzer
Beiträge
11
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.
 

Tommi

Datenbank-Guru
Beiträge
289
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
 

Zarathustra

Benutzer
Beiträge
11
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
 

Tommi

Datenbank-Guru
Beiträge
289
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
 
Werbung:

Zarathustra

Benutzer
Beiträge
11
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* : ) : ) : )
 
Oben