[SQL] Nicht MAX(spalte) sondern FIRST(spalte)

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Hi, ich habe z. B. so einen SQL:

Code:
SELECT spalte1, spalte2, spalte3, MAX(spalte4)
FROM tabelle
WHERE spalte1='xyz'
GROUP BY spalte1, spalte2, spalte3

jetzt möchte ich aber nicht die MAX-Spalte 4, sondern einfach die Erste, die gefunden wird. Also sowas wie

Code:
SELECT spalte1, spalte2, spalte3, FIRST(spalte4)
FROM tabelle
WHERE spalte1='xyz'
GROUP BY spalte1, spalte2, spalte3

hat da jemand ne Idee, wie ich das ohne großen Performanceaufwand lösen könnte? Verwendet wird eine DB2.

Danke!
 
S

SlaterB

Gast
um die Zahl der Ergebnisse einzugrenzen hat manche DB seine eigene Syntax,
z.B. rownum oder limit

du weißt ja wie die Forumsuche geht, falls du zu diesen beiden mehr lesen willst ;)
 

The_S

Top Contributor
ja, das weiß ich auch. Aber ich versteh nur nicht so ganz, wie mir diese Funktionen bei diesem Problem helfen sollte!?

[edit] bzw. ich weiß schon, wie es mir helfen könnte, nur nicht, wie ich es am dümmsten einsetze ;) .
 

P3AC3MAK3R

Top Contributor
Da prinzipiell nicht garantiert ist, daß die Reihenfolge der Datensätze, die mit einem select-Statement ohne order-by-Klausel ermittelt werden, immer gleich ist, habe ich meine Zweifel, daß das möglich ist, und es scheint auch keine entsprechende Aggregatfunktion zu existieren.

Kannst Du vielleicht den Hintergrund es Problemes ein weniger erläutern?
 
S

SlaterB

Gast
String x = deine Anfrage;
String y = SELECT * from (x) WHERE rownum = 1

String y = SELECT * from (x) LIMIT 1
bzw. das LIMIT 1 kannst du wohl auch direkt in dein x einbauen
(ungetestet)

edit: dass nur das nur auf eine Spalte haben möchtest, habe ich überlesen,
dürfte aber aufs gleiche hinauskommen?
 

The_S

Top Contributor
Der Hintergrund ist der, dass es der Kunde expliziet so gewünscht hat. Ich halte es auch für schwachsinnig, wenn nicht sogar fahrlässig (was ich ihm auch gesagt habe), aber der Kunde ist König ...

Ich habe einen etwas größeren SQL, der mir einige tausend Datensätze aus mehreren Tabellen ermittelt (auf die Daten und Struktur der Tabellen habe ich keinen Einfluss). In der "Haupttabelle" gibt es ein Feld, welches sich FONR nennt. Anhand von diesem Feld werden weitere Werte aus anderen Tabellen ermittelt, die in eine abschließende Berechnung miteinfliesen.

Jetzt kann es aber unter Umständen sein, dass dieses FONR-Feld in der Haupttabelle nicht ausgefüllt ist. In diesem Fall lese ich die FONR aus einer weiteren Tabelle aus. Leider ist es mir hierbei aber (aufgrund der Daten in der Haupttabelle) nicht möglich, eine eindeutige FONR zu ermitteln. Stattdessen bekomme ich immer mehrere FONR's zurück, die sich unter Umständen voneinander unterscheiden. Und der Wunsch des Kunden ist es nun, dass in solch einem Fall expliziet einfach die erste FONR gewählt wird, die gefunden wurde.

Ist Schwachsinnig, aber er wollte es so, da es in den anderen Anwendungen scheinbar auch so realisiert wird (warum auch immer :roll: ).

Prinzipiell könnte ich auch einfach weiterhin die MAX FONR verwenden, das wäre genauso Fehleranfällig. Aber wenn es aufgrund dessen mal zu nem Fehler kommt, bin ich der Blöde, weil ich nicht die erste FONR, sondern die höchste genommen habe :cry:
 

The_S

Top Contributor
@SlaterB

ja gut, aber so sollte ich ja wirklich nur den 1. Datensatz überhaupt bekommen. Ich möchte aber pro Group By den 1. Datensatz erhalten. Oder steh ich gerade auf dem Schlauch ???:L
 

P3AC3MAK3R

Top Contributor
Was mir gerade spontan einfällt:

Kannst Du vielleicht in der Datenbank Stored Procedures (SP) anlegen? In einer SP könntest Du ja in einer Schleife einen entsprechenden Cursor durchgehen und diese einfach nach dem ersten gefundenen Satz abbrechen.
 
S

SlaterB

Gast
nun, das ist bisschen was anderes,
dann vielleicht etwas in der Art von

Code:
SELECT spalte1, spalte2, spalte3, value
FROM tabelle a,
 (Select spalte4 as value FROM tabelle b
    where b.spalte1 = a.spalte1 and ...
    LIMIT 1
  )
WHERE spalte1='xyz' 
GROUP BY spalte1, spalte2, spalte3, value
aber da schalte ich mich langsam aus, kann ich nicht testen
 

The_S

Top Contributor
Ja, es besteht die Möglichkeit eine SP anzulegen. Das werde ich wohl auch so machen, wenn wir keine andere Möglichkeit mehr über SQL finden.

Aber (wie du evtl. schon aus meinem 2. Satz raushören kannst ;) ), wäre mir eine pure SQL-Lösung lieber, weil

- Evtl. braucht man sowas ja auch mal, wenn man nicht die Möglichkeit von SP's hat
- Dürfte ich die wieder in allen Möglichen Systemen (lokale test, test, echtsystem) einpflegen. Und vorallem fürs Echtsystem dauerts immer ewig, bis mal wieder ein Wartungsfenster angesetzt wird :-( .

Also Thread ist nur zur Hälfte erledigt - auf der Suche nach einer zweiten Lösung ;) .

@SlaterB hm, das sieht schon vom Ansatz her besser aus. Ich werd mal in die Richtung weiter arbeiten.
 

ms

Top Contributor
Wenn FONR eine Zahl ist dann würde ich die kleinste nehmen (MIN). Der Kunde (König) geht möglicherweise davon aus, dass die erste FONR auch die kleinste ist. Er beginnt ja auch bei 1 zu zählen. :)

ms
 

The_S

Top Contributor
nein, ist leider keine Zahl. Aber ich habe jetzt eine Lösung gefunden :) :

Code:
WITH sq1 AS (
	SELECT spalte1, spalte2, spalte3
	FROM tabelle
	GROUP BY spalte1, spalte2, spalte3
)

SELECT spalte1, spalte2, spalte3, (
	SELECT spalte4 
	FROM tabelle
	WHERE a.spalte1=b.spalte1 AND a.spalte2=b.spalte2 AND a.spalte3=b.spalte3
	FETCH FIRST 1 ROWS ONLY
) spalte4
FROM sq1
 

FenchelT

Bekanntes Mitglied
Hallo Hobbit,

nur zur Info,
hoffentlich setzt der Kunde nicht noch irgendwo den SQL Server 2000 ein, denn dann hast Du ein Problem.
Diese Funktion steht erst ab dem SQL 2005 zur Verfuegung.

Gruesse
 

The_S

Top Contributor
Hi FenchelT,

danke für den Hinweis, aber das kann ich ausschließen. Der "Kunde" ist ein "Nicht-IT"-Mitarbeiter unseres Unternehmens und hat die Anforderung für eine Portalanwendung auf unseren Server gestellt ;) .

lg
 

FenchelT

Bekanntes Mitglied
Okay,

andernfalls sollte auch folgendes sowohl im SQL Server 2k als auch im 2k5 funktionieren:


Code:
SELECT irgendein_feld1,....., irgendein_feldn,
     case
         when(fonr is null)
             then (SELECT TOP 1 feld_aus_anderer_Tabelle FROM andere_tabelle)
     end as temp_feld

Kannste ja bei Gelegenheit mal testen :wink:


Gruesse
 

The_S

Top Contributor
So wäre es natürlich am einfachsten, leider versteht der Server diese Syntax nicht (TOP number Spalte).
 

FenchelT

Bekanntes Mitglied
Ups, als ich Dein "WITH..." -SQL-Statement sah, dachte ich, du wuerdest mit dem MS SQL Server arbeiten?!

Falls nicht, vergiss es, mein Fehler. :roll:

Gruesse
 

seejay

Aktives Mitglied
also wenn ich es jetzt richtig verstanden habe, ist dein code fast richtig
Code:
SELECT spalte1, spalte2, spalte3, spalte4
FROM tabelle
WHERE spalte1='xyz'
GROUP BY spalte1, spalte2, spalte3

Da ein Group by nur den ersten wert nimmt und andere verwirft, also bei Tabelle
id - alter
1 -1
1 -3
2 -4
2 -1
2 -3

"Select id,alter from xxx group by id"
müsste
id - alter
1 -1
2 -4

raus kommen
 

bronks

Top Contributor
Hobbit_Im_Blutrausch hat gesagt.:
So wäre es natürlich am einfachsten, leider versteht der Server diese Syntax nicht (TOP number Spalte).
Strick das was FenchelT geschrieben hat um und verwende statt dem case when -----> iif()
 

The_S

Top Contributor
@ bronks

Hä? case when geht auf unserer DB2 ohne Probleme, das TOP-Statement gibt es nur nicht.

@ seejay

Hab ich was verpasst? Dein SQL sollte sich gar nicht erst ausführen lassen. Du kannst nicht manche Felder gruppieren bzw. aggregieren und andere einfach so lassen wie sie sind. Mal ganz davon abgesehen, dass mein SQL funktioniert ;) .

@ FenchelT

ich arbeite mit jeder Menge Datenbanken (u. a. auch MS SQL-Server 2005), die werden aber alle als Knoten in unserer DB2 "angesprochen" ;) .
 

FenchelT

Bekanntes Mitglied
Hobbit_Im_Blutrausch hat gesagt.:
@ seejay

Hab ich was verpasst? Dein SQL sollte sich gar nicht erst ausführen lassen. Du kannst nicht manche Felder gruppieren bzw. aggregieren und andere einfach so lassen wie sie sind. Mal ganz davon abgesehen, dass mein SQL funktioniert ;) .

Ja, da hast Du leider die "tollste" :autsch: Errungenschaft von mySQL verpasst.
Dort ist es moeglich auf Felder zu gruppieren, die nicht im SELECT stehen.
Macht zwar keinen Sinn, aber ich habe aufgehoert es zu versuchen, den Leuten zu erklaeren.

Hobbit_Im_Blutrausch hat gesagt.:
@ FenchelT

ich arbeite mit jeder Menge Datenbanken (u. a. auch MS SQL-Server 2005), die werden aber alle als Knoten in unserer DB2 "angesprochen" ;) .


Alles klar, habe verstanden :wink:
Schoenen Sonntag noch :)

Gruesse
 

seejay

Aktives Mitglied
Hobbit_Im_Blutrausch hat gesagt.:
@ seejay

Hab ich was verpasst? Dein SQL sollte sich gar nicht erst ausführen lassen. Du kannst nicht manche Felder gruppieren bzw. aggregieren und andere einfach so lassen wie sie sind. Mal ganz davon abgesehen, dass mein SQL funktioniert ;) .


Also Code funktioniert (MySQL), eben extra nochmal getestet.
spalte1 spalte2
1 2
2 4

War das Ergebnis von dieser Abfrage:
Code:
SELECT spalte1,spalte2
FROM `test`
GROUP BY spalte1
LIMIT 0 , 30
Bei folgendem Datensatz:

spalte1 spalte2
1 2
1 1
1 3
2 4
2 1
2 6

wie du siehst wurden genau die ersten herausgenommen, also wenn ich es richtig verstanden habe, dass was du wolltest.

FenchelT hat gesagt.:
Ja, da hast Du leider die "tollste" :autsch: Errungenschaft von mySQL verpasst.
Dort ist es moeglich auf Felder zu gruppieren, die nicht im SELECT stehen.
Macht zwar keinen Sinn, aber ich habe aufgehoert es zu versuchen, den Leuten zu erklaeren.

Verteh ich net so ganz, da die Spalten ja im Select drin stehen?!
 

The_S

Top Contributor
OK, ich hab noch nie mit MySQL gearbeitet, von daher kannte ich dieses "Feature" auch nicht. Nützt mir aber auch nichts, da ich hier kein MySQL verwende und somit eine andere Lösung benötige (die ich mittlerweile aber schon gefunden habe). Trotzdem Danke für den Hinweis und deine Mühen!

Hier ein kleines Beispiel, warum dieses "Feature" von MySQL irgendwo unlogisch ist:

Angenommen du bist Chef eines Bauunternehmens, und hast einige Arbeiter mit speziellen Fähigkeiten. Für einen Auftrag brauchst du jetzt Fließenleger, Maurer und Kranführer. Um jetzt einen besseren Überblick über deine Ressourcen zu bekommen, willst du diese Arbeiter "gruppieren". Dazu sagst du jetzt also: "Alle Fließenleger, Maurer und Kranführer herkommen" (select fließenleger, maurer, kranführer) und zur Gruppierung "Alle Fließenleger ins linke Eck, alle Maurer ins rechte Eck, und alle Kranführer in die Mitte" (group by fließenleger, maurer, kranführer). Schon weißt du genau, wer zu wem gehört. Wenn du jetzt aber sagst "Alle Fließenleger, Maurer und Kranführer herkommen" und anschließend nur "Alle Fließenleger ins linke Eck und alle Maurer ins rechte Eck" dann wissen die Kranführer ja nicht ganz wohin sie sollen.

Kann man jetzt zwar nicht 100pro so auf SQL übertragen, aber ich denke mal das Beispiel sollte einigermaßen klar sein!?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
pkm PostgreSQL Auf eine Spalte kann aus einem Teil der SQL-Aussage nicht zugegriffen werden Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
W MySQL-Connector funktioniert nicht über WLAN -> MacOS Datenbankprogrammierung 10
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
P Reicht finally nicht um DB connections zu schließen in (altem) Java? Datenbankprogrammierung 4
D JOIN COLUMN wird nicht genommen Datenbankprogrammierung 2
Maxim6394 JPA / EclipseLink - n:m Beziehung wird nicht aktualisiert Datenbankprogrammierung 0
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
D Ich möchte dass ich nachdem man den Kommentar geschrieben hat den Kommentar in den Tabelle Bestellübersicht geschbeichert wird klappt nicht bei mir Datenbankprogrammierung 2
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
A Java DB Server lässt sich nicht starten Datenbankprogrammierung 3
B SQlite Datenbank, trotz Statements wurden nicht alle Zeilen erzeugt? Datenbankprogrammierung 35
T Datenzeilen werden nicht gelöscht Datenbankprogrammierung 6
Warum funktioniert MySQL nicht Datenbankprogrammierung 8
S Das printen der Ausgabe des Oracle-SQL-Statements in der Java-Eclipse-Konsole funktioniert nicht Datenbankprogrammierung 6
S Datenbankprogrammierung in Java unter NetBeans 12 funktioniert nicht! Datenbankprogrammierung 1
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
Watsoon Treiber wird in Intellij nicht geladen Datenbankprogrammierung 2
Kirby.exe PreparedStatement wird nicht ausgeführt Datenbankprogrammierung 5
rafi072001 MicroServices EurekaClient findet anderern EurekaClient nicht Datenbankprogrammierung 1
D JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht Datenbankprogrammierung 3
Z Datenbank Choicebox wird nicht befüllt Datenbankprogrammierung 15
G MySQL JDBC Metadaten auslesen aus .accdb -> Primärschlüssel manchmal erkannt manchmal nicht Datenbankprogrammierung 3
C MySQL SQL Statement wir nicht ausgeführt Datenbankprogrammierung 11
N Sqlite DB mit Java wird auf Linuxsystem nicht gefunden Datenbankprogrammierung 9
pkm Tomcat Classloader findet bei JPA-Persistierung die Persistence Unit nicht. Datenbankprogrammierung 11
F Tabellen automatisch erstellen wenn sie nicht existieren Datenbankprogrammierung 6
J Netbeans 11 und Eclipse JPA 2.5 Entity wird nicht gefunden Datenbankprogrammierung 4
J Java fügt Datensätze ein aber diese werden nicht richtig abgefragt Datenbankprogrammierung 3
J Firebase KeepSynced funktioniert nicht Datenbankprogrammierung 0
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
B MySQL Data Tools Plattform - "Database Connections" findet den Treiber nicht Datenbankprogrammierung 1
OnDemand One to Many bekomm es nicht hin Datenbankprogrammierung 7
L SQL-Statement INSERT INTO ON DUPLICATE KEY UPDATE funktioniert nicht Datenbankprogrammierung 5
OnDemand Update auf Mysql läuft nicht durch Datenbankprogrammierung 30
R jdbc-Zugriff Nicht erlaubt ? Datenbankprogrammierung 16
F H2 ObjectOptimisticLockingFailureException wird nicht geworfen Datenbankprogrammierung 0
R findet Derby.DB nicht !? Datenbankprogrammierung 5
I Datenbankverbindung Oracle DB klappt nicht - getConnection returned null Datenbankprogrammierung 8
X SQLite SQLite Programm beendet/führt nicht weiter aus Datenbankprogrammierung 12
P LDAP: Daten eintragen funktioniert nicht Datenbankprogrammierung 7
Ananaskirsche Datenbanktreiber kann nicht geladen werden Datenbankprogrammierung 2
S sun.jdbc.odbc.JdbcOdbcDriver wird nicht gefunden Datenbankprogrammierung 2
U Kann die Tabellen nicht finden Datenbankprogrammierung 0
M Java Datenbankanbindung funktioniert nicht Datenbankprogrammierung 4
C MYSQL kann wert nicht eintragen Datenbankprogrammierung 3
J Verbindung zu Derby Datenbank funktioniert nicht Datenbankprogrammierung 14
S MySQL MySQL will einfach nicht, bitte um Rat Datenbankprogrammierung 4
E Warum funktioniert das Erzeugen einer View nicht? Datenbankprogrammierung 1
E Warum kann mein SQL-File nicht in DB2 ausgeführt werden? Datenbankprogrammierung 1
M JDBC Tabellen mit Boolean Spalten können nicht erstellt werden. DB Updaten - wie? Datenbankprogrammierung 6
T Tabellen von nicht mehr vorhandenen Entities werden generiert Datenbankprogrammierung 0
OnDemand Update table SET will nicht Datenbankprogrammierung 9
M DB-Zugriff funktioniert nach JAR-Erstellung nicht mehr Datenbankprogrammierung 3
J SQL-Statement Meine insert befehle funktionieren nicht und ich weiß nicht wo der fehler liegt Datenbankprogrammierung 5
S MySQL Speicher wird nicht freigegeben bei Datenbankabfragen Datenbankprogrammierung 6
L SQL Statement mit Switch-Case funktioniert nicht Datenbankprogrammierung 6
D MySQL Eingabe wird nicht übernommen... Datenbankprogrammierung 11
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
F sun.jdbc.odbc.jdbcodbcdriver wird nicht gefuden Datenbankprogrammierung 3
L JTable-DB: Letzter wert wird nicht angezeigt. Datenbankprogrammierung 0
I Datenbank Verbindung geht nicht Datenbankprogrammierung 2
L MySQL App/Java Zugriff auf Mysql-DB funktioniert nicht Datenbankprogrammierung 1
I Kann nicht mit iiS DB Verbinden Datenbankprogrammierung 1
S Verbindungsaufbau zu MySql Datenbank nicht möglich Datenbankprogrammierung 3
D [xBaseJ] Datei kann nicht geöffnet werden Datenbankprogrammierung 2
N JDBC: rollback() bei Exception geht nicht!? Datenbankprogrammierung 1
K Datenbank wird bei Programmstart als .jar nicht mehr befüllt Datenbankprogrammierung 12
R Datenbankverbindung kann nicht hergestellt werden Datenbankprogrammierung 8
M Oracle Bekomme fertiges Tool nicht ans Laufen Datenbankprogrammierung 3
V Test H2-DB löscht nicht die IDs Datenbankprogrammierung 0
P PostgreSQL Java-Anwendung zählt rollbacks nicht Datenbankprogrammierung 0
M Finde einen eifachen Befehl nicht Datenbankprogrammierung 4
T MySQL Datetime wird auf Sekunden gerundet, soll es aber nicht Datenbankprogrammierung 2
P MySQL jpmdbc: Kann lesen aber nicht schreiben? Datenbankprogrammierung 3
1 MySQL Verbindung mit localhost als IP funktioniert, aber mit normaler IP nicht Datenbankprogrammierung 2
M Derby/JavaDB Neu geschriebener Eintrag per UPDATE lässt sich nicht unmittelbar abrufen Datenbankprogrammierung 2
J Datenbankeintag eines Warenkorbes funktioniert nicht Datenbankprogrammierung 4
AMStyles Kann Wert nicht speichern (MAX VALUE) Datenbankprogrammierung 9
M MySQL INSERT will einfach nicht funktionieren Datenbankprogrammierung 9
A Nach Export mysql Verbindung zur Datenbank nicht möglich, was tun? Datenbankprogrammierung 7
T SQL-Statement case when then klappt nicht Datenbankprogrammierung 4
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
J JDBC in Library|"Treiber konnte nicht geladen werden"" Datenbankprogrammierung 2
D MySQL Treiber konnte nicht geladen werden Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
C Db4o speichert verschachtelte Objekte nicht vollständig Datenbankprogrammierung 8
P SQL-Statement "Top 1" oder "limit" funktioniert nicht Datenbankprogrammierung 12
C Programm wird nach DB-Eintrag nicht weitergeführt Datenbankprogrammierung 5
R sqlite UPDATE wirkt nicht aus Java Datenbankprogrammierung 7
crashfinger jdbc-connection mit jre7 funktioniert nicht Datenbankprogrammierung 5
R PostgreSQL Tabellen hinzufügen, falls nicht vorhanden Datenbankprogrammierung 3
T f:event preRenderView Trigger wird nicht ausgeführt Datenbankprogrammierung 4
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
D Derby Datenbank bei Export zu JAR-Datei nicht möglich Datenbankprogrammierung 8
A MySQL Datensatz wird nicht richtig gelöscht Datenbankprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben