Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL (allg.): SELECT FIRST u.ä. oder <window clause> (https://www.delphipraxis.net/140171-sql-allg-select-first-u-ae-oder-window-clause.html)

Jürgen Thomas 12. Sep 2009 11:30

Datenbank: beliebig • Zugriff über: beliebig

SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Hallo,

ich habe mal wieder eine Frage zum SQL-Standard.

Die Frage, wie die ersten/letzten n Datensätze geholt werden, wird in den verschiedenen DBMS unterschiedlich beantwortet:

Firebird a: ROWS <value1> TO <value2>
Firebird b: FIRST <value1> SKIP <value2>
MS-SQL: TOP <value> PERCENT WITH TIES
MySql, Oracle a: LIMIT <value1>, <value2>
MySql, Oracle b: LIMIT <value1> OFFSET <value2>

Im SQL-Standard 2003, konkret in der Datei 5WD-02-Foundation-2003-09.pdf von http://www.wiscorp.com/sql_2003_standard.zip, konnte ich keinen Hinweis auf diese Funktionalität finden.

Andererseits gibt es dort die <window clause>, unter der ich mir nichts vorstellen kann.

Kann mir jemand einen Hinweis darauf geben, inwieweit die FIRST-Regelung im SQL-Standard (2003 oder 2008) geregelt ist, und/oder was es mit der <window clause> auf sich hat?

Danke! Jürgen

DeddyH 12. Sep 2009 12:10

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Zur Window-Clause bin ich bei iAnywhere fündig geworden.

Jürgen Thomas 12. Sep 2009 12:29

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Danke für den Link, das ist etwas verständlicher als in der SQL-Dokumentation. Aber wozu es gut ist, verstehe ich weiterhin nicht. Ich glaube jetzt jedenfalls, dass es nichts mit meiner Hauptfrage nach SELECT FIRST u.ä. zu tun hat. Jürgen

hoika 13. Sep 2009 18:35

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Hallo,

schau mal hier

1

Zusammenfassung:
ROW_NUMBER ist der Standard.


Heiko

Jürgen Thomas 14. Sep 2009 07:48

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Hallo Heiko,

danke für diesen Hinweis. Damit werde ich in der SQL-Dokumentation (2003 und 2008) mal nach ROW_NUMBER suchen. Die anderen Verfahren weichen zwar insofern davon ab, weil sie mit "normalen" Klauseln des SELECT-Befehls arbeiten und ROW_NUMBER() als Funktion deklariert wird. Aber mal sehen...

Verwirrt hat mich zusätzlich ein Hinweis in der FB-Dokumentation von IBExpert (Holger Klemt):
Zitat:

The SQL-compliant ROWS syntax obviates the need for FIRST and SKIP...
ROWS in Firebird wäre also wegen größerer Nähe zum SQL-Standard eingeführt worden. Aber in der SQL-Dokumentation habe ich keine Bestätigung für diese Verwendung von ROWS gefunden.

Gruß Jürgen

mkinzler 14. Sep 2009 07:50

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Eher aus Kompatibilitätsgründen zu Interbase

Jürgen Thomas 14. Sep 2009 08:11

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Die Kompatibilität zu Interbase entspricht doch dem "älteren" Verfahren mit FIRST/SKIP. Aber ROWS? Oder hat IB inzwischen (d.h. seit der Trennung durch FB) ROWS eingeführt, und FB hat gleichgezogen? Das würde mich eher wundern.

Aber vielleicht kann Holger "seine" Formulierung kurz erklären.

Jürgen

mkinzler 14. Sep 2009 08:35

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
First/Skip ist FB, bei IB hiess es schon immer ROWS. Deshalb wurde in FireBird das ROWS nachimplementiert

IBExpert 14. Sep 2009 20:03

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
first und skip ist aber ein nicht so weit verbreiteter Standard, der offizielle Standard benutzt die Rows Syntax
hier ein Dokument zur SQL 2003 Syntax für Interessierte
http://savage.net.au/SQL/sql-2003-2.bnf.html

Jürgen Thomas 15. Sep 2009 09:03

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Zitat:

Zitat von IBExpert
first und skip ist aber ein nicht so weit verbreiteter Standard,

Das ist mir klar; es ist wohl hauptsächlich (oder nur?) für IB/FB relevant.
Zitat:

der offizielle Standard benutzt die Rows Syntax
Was ist denn offiziell? In meinem ersten Beitrag habe ich ein PDF-Dokument dazu genannt, aber dort nichts gefunden.
Dort wird ROWS wieder mit der <window clause> in Verbindung gebracht. Damit komme ich wieder zu meiner obigen Zusatzfrage: Wozu ist die gut? Nach Detlefs Antwort in #2 hatte ich vermutet, dass die nichts mit FIRST/LIMIT/TOP u.ä. zu tun hat. Oder etwa doch?

Unter WikiBooks: Einführung in SQL habe ich es im Moment so formuliert:
Zitat:

Der SQL-Standard hat dafür (noch) kein Verfahren festgelegt. Jedes DBMS bietet eine eigene Lösung an; abweichend vom üblichen Vorgehen in diesem Buch zeige ich mehrere Lösungen.
Welcher Text wäre angemessener? (Der Kommentar ist nur unter "Bearbeiten" sichtbar, nicht im Buchtext.)

Gruß Jürgen

PS. Nach Kritik am WikiBook insgesamt möchte ich zu gegebener Zeit fragen; im Moment geht es mir um korrekte Formulierungen in Einzelfragen.

DeddyH 15. Sep 2009 09:17

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Ich bin mir nicht ganz sicher, wie das zu deuten ist (aus meinem geposteten Link):
Zitat:

BETWEEN clause Use the BETWEEN clause to define the first and last row of the window, using the current row as a reference point. First and last rows are expressed in terms of the number of rows preceding and following the current row, respectively. For example, BETWEEN 3 PRECEDING AND 5 FOLLOWING sets the window to start with the third row preceding the current row, and end with the fifth row following the current row.

IBExpert 15. Sep 2009 09:24

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Ich hab mir schon vor Jahren abgewöhnt, irgendwelche Standards zu hinterfragen, eine 90% SQL kompatible Applikation ist meist kein Problem, 100% SQL kompatibel ist nur mit extremen Einschränkungen möglich. Da ich schon Erfahrung mit Firebird/Oracle/DB2 kompatibler Anwendungsentwicklung gemacht habe kenn ich diverse Konstrukte, die inkompatibel sind, aber auf db2 und Firebird war es relativ einfach, gemeinsam funktionierende SQLs zu entwickeln, die dann sogar noch das gleiche Ergebnis bringen, was übrigens keineswegs immer der fall ist, gerade Oracle hatte da durchaus weniger lustige Überraschungen parat.

Jürgen Thomas 15. Sep 2009 09:32

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
Naja, ich hatte schon die Idee, ob <window clause> vielleicht ein "Fenster" innerhalb der gesamten Abfragemenge bezeichnen könnte; mit den ROWS-Parametern und den von Detlef zitierten Angaben würde dieses "Fenster" genauer positioniert. Aber die "current row" passt m.E. nicht dazu: Was soll die innerhalb einer Datenmenge bedeuten? Das deutet für mich eher auf einen Arbeitsablauf innerhalb einer StoredProcedure oder eines EXECUTE-Befehls hin.

Ich gebe zu, dass mein Englisch große Lücken aufweist, vor allem wenn es komplexe Satzkonstruktionen mit Fachbegriffen sind. Im Fall SQL brauche ich zusätzlich Beispiele; und die fehlen mir bei den allgemeinen SQL-Definitionen. Keine der speziellen DBMS-Dokumentationen, die ich ständig zu Rate ziehe (FB, MS, MySql, Oracle), verwendet den Begriff <window clause> im Zusammenhang mit SELECT FIRST u.ä. (sofern es dies überhaupt kennt).

Es geht mir hier auch gar nicht um kompatible SQL-Befehle, sondern um allgemein gültige Erklärungen für das WikiBook Einführung in SQL. Da muss schon alles korrekt sein; und wenn ich etwas selbst nicht richtig verstehe, wie soll ich es dann erläutern?

Jürgen

IBExpert 15. Sep 2009 09:48

Re: SQL (allg.): SELECT FIRST u.ä. oder <window clause>
 
ist kein vorwurf an dich, sondern eher ein hinweis auf eine gesunde Kritik gegenüber
sogenannter Standards.

Ganz einfache Frage: Wann ist beim Fußball abseits?
Ganz einfache Antwort: Abseits ist wenn der Schiedsrichter abseits pfeift, wer auch immer wann wo rumgestanden hat

Das Problem sieht man an so ziemlich jedem Wochenende im Fernsehen und es gibt ungeheuer schlaue Definitionen der FIFA, wann der Schiedsrichter denn Abseits pfeifen sollte. Genau wie die Interpretation des Schiedsrichters immer die Spielsituation beinhaltet und das was er dabei gesehen hat, ist es für den Programmierer: Wer etwas realisiert die zum Beispiel eine rows anweisung muss Freiraum zur Interpretation haben .

Beispiel:

select * from
(select * from Tab1 rows 1 to 10) t1
join (select * from Tab2 rows 11 to 20) t2 on t2.id=t1.id
rows 5 to 15

ist in Firebird eine gültige Anweisung, aber in welcher reihenfolge arbeitet man das ab? erst join, dann rows, erst rows, dann join, erst innere rows, erst externe rows, ....

Ein Programmierer einer Datenbankengine muss eine Entscheidung treffen und diese kann sich nachträglich durchaus mal als abweichend vom später definierten Standard zeigen. Wenn aber dann schon Benutzer die nicht standardkonforme Umsetzung nutzen und sich auf deren Verhalten verlassen, dann ist eine nachträgliche Anpassung an der sogenannten Standard eher kontraproduktiv.

Ähnlich wie der Schiedsrichter macht der Programmierer oft Tatsachenentscheidungen und die einfach mal so zu ersetzen schafft selten Vertrauen.

Nähe am Standard ist sowohl für Programmierer als auch für Schiedsrichter hilfreich, aber der Standard sollte kein Gefängnis sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz