Zum Inhalt springen

Abfragen in SQL

Im Modus SQL schreiben Sie die Abfrage selbst. Alles, was PostgreSQL lesend kann, ist erlaubt: WITH-Ketten, Fensterfunktionen, GROUP BY-Kombinationen. Der Baukasten kennt diese Formen nicht, und deshalb bleibt SQL die eigentliche Form eines Abfrage-Tags.

Der Punkt, an dem sich alles entscheidet: zwei Schreibweisen

Abschnitt betitelt „Der Punkt, an dem sich alles entscheidet: zwei Schreibweisen“

TrakState speichert eine Abfrage mit physischen Namen. Eine Datensatz-Art heißt gespeichert rt_ plus 32 Hexadezimalzeichen, ein Feld f_ plus 32 Hexadezimalzeichen. Diese Namen hängen an der Identität und überleben jedes Umbenennen — richtig für die Speicherung, unlesbar für einen Menschen:

SELECT f_3a9b1c…::numeric AS actual_runtime FROM rt_c81f… WHERE f_11ab… >= $1

Angezeigt wird dieselbe Abfrage in der lesbaren Schreibweise. Jeder physische Name steht als der Fachname, für den er steht, in doppelten Anführungszeichen:

SELECT "ProductionReport.ActualRuntime"::numeric AS actual_runtime
FROM "ProductionReport"
WHERE "ProductionReport.Timestamp" >= $1

Das ist der Grund, warum Abfragen früher nicht zu lesen waren. Was Sie im Editor sehen und bearbeiten, ist immer die lesbare Schreibweise; übersetzt wird auf dem Server, genau einmal, auf dem Weg hinein.

  • Doppelte Anführungszeichen sind ein Name. In PostgreSQL ist "…" immer ein Bezeichner und nie ein Text. Ein Text steht in einfachen Anführungszeichen. Deshalb kann die Rückübersetzung nichts anfassen, was gar kein Name ist.
  • Ein Feld ist ein einzelner Bezeichner, "ProductionReport.GoodParts", nicht "ProductionReport"."GoodParts". So steht er an jeder Stelle richtig, auch in einer CTE, in der die Tabelle nicht mehr im Blick ist.
  • Ein unbekannter Name wird abgelehnt, nicht geraten. Schreiben Sie "Foo.Bar" und dieser Mandant hat kein solches Feld, verweigert TrakState das Speichern und nennt den Namen.
  • Ein Name ohne Punkt bleibt stehen, solange er keine Datensatz-Art ist. AS "Value" ist ein Spaltenname für die Ausgabe und soll genau das bleiben.

Wird ein Feld gelöscht, nachdem die Abfrage geschrieben wurde, gibt es für seinen physischen Namen keinen Fachnamen mehr. Er bleibt dann als f_… stehen, und über dem Editor erscheint ein Hinweis, welche Namen das sind. Die Abfrage läuft weiter; erfunden wird nichts.

Der Editor färbt PostgreSQL ein und vervollständigt aus Ihrem eigenen Mandanten: die Datensatz-Arten, deren Felder in der lesbaren Schreibweise, die deklarierten Parameter und die gebräuchlichen Schlüsselwörter. Ein Feld wird mit den Anführungszeichen eingesetzt, weil nur diese Schreibweise sich auflösen lässt.

Geprüft wird nicht vom Editor, sondern von der Datenbank selbst: Ausprobieren führt die Abfrage aus und stellt einen Syntaxfehler als Markierung unter das Wort, auf das PostgreSQL zeigt. Siehe Der Probelauf.

Schreiben. Eine Abfrage läuft in einer nur lesenden Transaktion; ein Schreibversuch wird von der Datenbank abgelehnt, nicht von einer Textprüfung. Das gilt für den Probelauf genauso wie für den laufenden Betrieb.

Und: eine Änderung hier verwirft die Beschreibung des Baukastens, falls es eine gab (siehe Abfragen mit dem Baukasten).