Fälle bei WHERE unterscheiden

deemon84

Mitglied
Hallo,

ich arbeite an einem Projekt und hänge seit einiger Zeit bei einer SQL Query. Die Tabelle sieht wie folgt aus:
PNR STATUS DATUM ID
10 Vorbereitung 13:10:00 1
10 Nutzung 13:20:00 2

20 Deaktiviert 14:00:00 3
20 Deaktiviert 14:10:00 4
20 Deaktiviert 14:30:00 5

30 Deaktiviert 15:00:00 6
30 Vorbereitung 15:20:00 7

40 Deaktiviert 16:00:00 8


Die Abfrage soll folgendes erreichen:

a) wenn zu einem bestimmten PNR nur Elemente gehören, wo in der Spalte STATUS 'Deaktiviert' steht, dann muss das Query diejenige Zeile zurückgeben, wo das DATUM maximal ist.
D.H. für 20 soll es die Zeile zurückgeben, wo 14:30:00 steht.
Und für 40, die Zeile, wo 16:00:00 ist.

b) wenn zu einem PNR sowohl Deaktiviert, als auch etwas anderes in der Spalte STATUS steht, oder überhaupt kein Deaktiviert vorkommt, dann alle Zeilen, wo Deaktiviert nicht vorkommt.
D.h. für PNR=30 nur die Zeile, wo Vorbereitung steht, und für 10 die beide Zeilen.


Ich habe an einem stored procedure gedacht, wo ich änlich zum Java, alle PNR durchlaufe, und zu den jeweiligen PNR die Spalte STATUS abfrage, und entsprechende Werte aus der Spalte ID nehme. Dann kann ich die ursprüngliche Tabelle und die so zusammengestellten ID's miteinander verknüpfen.

Ginge es auch ohne proc?
(Wenn nicht oder zu kompliziert, dann ist es auch ok mit einem proc.)

Vielen Dank,
Daniel
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Ich denke das geht. Steht in der Tabelle wirklich "Vorbereitung", "Nutzung" und "Deaktiviert" oder ist das ein ENUM?
 

Tobse

Top Contributor
Hab ein bisschen rumprobiert, das kam dabei raus:

wenn man die status spalte als ENUM (also als Zahl) darstellt, kann man sich die SUM() Funktion und ein GROUP-BY zu Nutze machen. In meine Fall 0 = Deaktiviert, 1 = Vorbereitung, 2 = Nutzung.

Wenn bei dir wirklich die Strings in der DB stehen musst du eine View drüber legen, welche dir die Strings durch Zahlen ersetzt; an sonsten kommst du mit meiner Lösung nicht weit.

Beim ersten Teil ist ein ziemlich schräger self-join notwendig gewesen weil sich nicht beeinflussen lässt, welche ID bei einem GROUP-BY zurückgegeben wird. Dadurch wird vorausgesetzt, dass ID unique ist und dass es ein DATUM pro PNR nur einmal gibt (sprich UNIQUE-Index auf PNR und DATUM).

Der zweite Teil ist vergleichsweise simpel, weil hier ja alle Zielen benötigt werden und nicht nur eine spezielle. Der Subquery ist trotzdem nötig, damit auch wirklich alle Zeilen dabei rauskommen.

SQL:
SELECT
    test.pnr as pnr,
    test.`status` as `status`,
    temp_test.maxD as datum,
    (SELECT id FROM test WHERE pnr = temp_test.pnr AND datum = temp_test.maxD) AS id
FROM test
JOIN
    (SELECT test.*, MAX(datum) as maxD FROM test GROUP BY test.pnr HAVING SUM(`status`) = 0) temp_test
    ON temp_test.id = test.id
   
UNION

SELECT * FROM test WHERE pnr IN (SELECT pnr FROM test GROUP BY test.pnr HAVING SUM(`status`) != 0) AND `status` != 0
 

deemon84

Mitglied
SQL:
JOIN
    (SELECT test.*, MAX(datum) as maxD FROM test GROUP BY test.pnr HAVING SUM(`status`) = 0) temp_test
    ON temp_test.id = test.id


Hallo,

vielen Dank für die super schnelle Antwort. Die Werte in der Spalte Status sind Strings, aber ich werde das View anpassen, damit Zahlen zurückgegeben werden.
Das einzige Problem hatte ich beim SELECT test.*. Dadurch werden auch Spalten ausgewählt, die nicht im GROUP BY vorkommen, und das ging nicht. Habe PNR und Datum als Schlüssel genommen.
Ansonsten hat es prima funktionert.

Vielen Dank,
Daniel
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
J Mehrere WHERE Werte benutzen Datenbankprogrammierung 2
B JPA -> Dynamische WHERE Clause / SQL Injection möglich? Datenbankprogrammierung 11
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
A WHERE datetime < (util.Date | sql.Date | sql.Timestamp | dateString) Datenbankprogrammierung 2
M Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen? Datenbankprogrammierung 28
R Derby/JavaDB Select Statement Where bedingung will nicht ganz! Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
N Prepared Statement mit unbekannter Anzahl von Where-Clauses Datenbankprogrammierung 30
C MySQL Abfrage mit flexibler WHERE bedingung Datenbankprogrammierung 10
K Unkown Column in where clausel Datenbankprogrammierung 2
Y JPQL WHERE != Objekt Datenbankprogrammierung 10
J where Abfrage auf ein mysql date feld Datenbankprogrammierung 5
M Select * from mydaten where ... Datenbankprogrammierung 4
M Mysql Delete ohne Where Klausel untersagen Datenbankprogrammierung 8
M SQL-Abfrage mit where-Bedingung Datenbankprogrammierung 2
W Where-ähnliche abfrage in objektorientierter Datenbank Datenbankprogrammierung 5
G Frage zu SQL "WHERE IN (1, 2, 3. , N)" Datenbankprogrammierung 8
S Platzhalter in WHERE Klausel Datenbankprogrammierung 16

Ähnliche Java Themen

Neue Themen


Oben