PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JDBC-Teilabfrage


Shink
2007-05-11, 16:03:10
Ich will in Java über JDBC eine DB-unabhängige Teilabfrage machen; genau:
Jemand will die ersten 100 Datensätze sehen oder z.B.: die Datensätze von 400000-400100. Allerdings weiß ich nicht, wie die IDs dieser Datensätze aussehen und somit reicht ein WHERE ... BETWEEN ... AND ... nicht aus.

Die ersten Datensätze bekomm ich ja AFAIK effizient, wenn ich auf mein ResultSet nach 100 Datensätze nicht mehr "getNext()" ausführe - aber wie verfahre ich in einem anderen Fall? (Datensatz 40000-400100?)

In verschiedenen Datenbanken gibt es ja solche Konstrukte, aber die sind leider nicht einheitlich oder gar SQL-konform.

Ganon
2007-05-11, 16:10:29
Ich glaube mit absolute(int row) kannst du zu einem Datensatz springen.

Gast
2007-05-11, 16:18:04
Ich will in Java über JDBC eine DB-unabhängige Teilabfrage machen; genau:
Jemand will die ersten 100 Datensätze sehen oder z.B.: die Datensätze von 400000-400100. Allerdings weiß ich nicht, wie die IDs dieser Datensätze aussehen und somit reicht ein WHERE ... BETWEEN ... AND ... nicht aus.

Die ersten Datensätze bekomm ich ja AFAIK effizient, wenn ich auf mein ResultSet nach 100 Datensätze nicht mehr "getNext()" ausführe - aber wie verfahre ich in einem anderen Fall? (Datensatz 40000-400100?)

In verschiedenen Datenbanken gibt es ja solche Konstrukte, aber die sind leider nicht einheitlich oder gar SQL-konform.

Hallo Shink,

das funktioniert nicht, wie schon selbst bemerkt hast. Genau genommen darf soetwas auch nicht funktionieren, da es sich immer um Mengen handelt, die ungeordnet sind. Du mußt schon selbst ein Ordnungskriterium einführen ujnd zwar in den Daten selbst.

Überlege dir selbst, was die 400000-400100 sein sollen? In einer Menge von Daten, können das nämlich immer unterchiedliche Datensätzte sein, so als wenn du ein Los ziehst. Das sagt die Mengenlehre aus. Natürlich werden bei einem entsprechenden Index immer die gleichen Datensätze selektiert. Aber hierbei verläßt du dich auf ein Implementierungsdetail.

Also, so wie du dir das vorstellt geht es nicht. Oracle hat ROW IDs, andere Datenbanken zwar auch (DB2), aber die Abfragen sind jeweils anders und die ROW IDs sind soweit ich weiß, auch nicht mit einem bestimmten Datensatz gebunden.

Shink
2007-05-11, 16:18:18
Ich glaube mit absolute(int row) kannst du zu einem Datensatz springen.
Vielen Dank!
Jetzt hoffe ich nur noch, dass mein AS400-Treiber das unterstützt...

Shink
2007-05-11, 16:21:15
Hallo Shink,

das funktioniert nicht, wie schon selbst bemerkt hast. Genau genommen darf soetwas auch nicht funktionieren, da es sich immer um Mengen handelt, die ungeordnet sind. Du mußt schon selbst ein Ordnungskriterium einführen ujnd zwar in den Daten selbst.

Überlege dir selbst, was die 400000-400100 sein sollen? In einer Menge von Daten, können das nämlich immer unterchiedliche Datensätzte sein, so als wenn du ein Los ziehst. Das sagt die Mengenlehre aus. Natürlich werden bei einem entsprechenden Index immer die gleichen Datensätze selektiert. Aber hierbei verläßt du dich auf ein Implementierungsdetail.

Also, so wie du dir das vorstellt geht es nicht. Oracle hat ROW IDs, andere Datenbanken zwar auch (DB2), aber die Abfragen sind jeweils anders und die ROW IDs sind soweit ich weiß, auch nicht mit einem bestimmten Datensatz gebunden.
Danke ebenfalls.

Stimmt: Ich könnte die Daten ja z.B. auch beliebig sortieren.
Aber nett wäre es, wenn die Datenbank zwar von mir aus alles ausliest (wenn sie denn muss), aber nicht alle Datensätze über den TCP-Port rüberschiebt.

HellHorse
2007-05-11, 22:22:01
Danke ebenfalls.

Stimmt: Ich könnte die Daten ja z.B. auch beliebig sortieren.
Aber nett wäre es, wenn die Datenbank zwar von mir aus alles ausliest (wenn sie denn muss), aber nicht alle Datensätze über den TCP-Port rüberschiebt.
LIMIT OFFSET (nun ist aber SQL nicht wirklich portabel).