Es entsteht ein Implizit CROSS JOIN
. Es ist die SQL-89-Syntax.
Hier benutze values(1)
und values(2)
erstelle ich pseduo-Tabellen (Wertetabellen) nur als Beispiel. Die Sache nach ihnen t(x)
, und g(y)
wird als FROM-Aliases der Zeichen in der Klammer ist der Alias für die Spalte ( x
und y
jeweils). Sie könnten genauso einfach eine Tabelle erstellen, um dies zu testen.
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
So würden Sie es jetzt schreiben.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
Von dort aus können Sie dies implizit machen, INNER JOIN
indem Sie eine Bedingung hinzufügen.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
Oder die explizite und neuere INNER JOIN
Syntax,
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
Also in deinem Beispiel ..
FROM apod, to_tsquery('neutrino|(dark & matter)') query
Dies entspricht im Wesentlichen der neueren Syntax.
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
Das ist in diesem Fall eigentlich das Gleiche, weil to_tsquery()
eine Zeile und keine Menge zurückgegeben wird als:
SELECT title, ts_rank_cd(
textsearch,
to_tsquery('neutrino|(dark & matter)')
) AS rank
FROM apod
WHERE to_tsquery('neutrino|(dark & matter)') @@ textsearch
ORDER BY rank DESC
LIMIT 10;
Dies kann möglicherweise to_tsquery('neutrino|(dark & matter)')
zu zweimaligem Auftreten führen. In diesem Fall ist dies jedoch nicht der Fall - und to_tsquery
wird als STABLE (verifiziert mit \dfS+ to_tsquery
) gekennzeichnet.
STABLE
Gibt an, dass die Funktion die Datenbank nicht ändern kann und dass sie innerhalb eines einzelnen Tabellenscans konsistent dasselbe Ergebnis für dieselben Argumentwerte zurückgibt, das Ergebnis sich jedoch über SQL-Anweisungen hinweg ändern kann. Dies ist die geeignete Auswahl für Funktionen, deren Ergebnisse von Datenbanksuchen, Parametervariablen (wie der aktuellen Zeitzone) usw. abhängen Die Funktionsfamilie current_timestamp gilt als stabil, da sich ihre Werte innerhalb einer Transaktion nicht ändern.
Für einen vollständigeren Vergleich der Unterschiede zwischen SQL-89 und SQL-92 siehe auch meine Antwort hier
,
, eine Kreuzverknüpfung zu erstellen, da es sich nur um ein kartesisches Produkt handelt und kein Vergleich erforderlich ist. Können Sie nur noch eine Frage beantworten, BITTE? was istt(x)
in(values(1)) AS t(x)
???to_tsquery()
gibt einen Wert zurück, keine Zeile . Und nur weil eine Funktion definiert istSTABLE
, das bedeutet nicht , die Abfrage Planer werden wiederholte Auswertung vermeiden. Es kann .Das Handbuch enthält eine detaillierte Erklärung für das Komma in der
FROM
Liste im Kapitel Tabellenausdrücke :Die Tatsache , dass durch Kommata getrennte Tabellenverweise haben in einer früheren Version der SQL - Standards als explizit definiert wurden
JOIN
Syntax nicht nicht das Komma falsch oder veraltet machen. Verwenden Sie eine explizite Join-Syntax, wenn dies technisch erforderlich ist (siehe unten) oder der Abfragetext klarer wird.Das Handbuch nochmal:
"Äquivalent" heißt aber nicht identisch . Es gibt einen subtilen Unterschied, wie das Handbuch feststellt :
Diese verwandte Frage zeigt die Relevanz des Unterschieds:
Grundsätzlich ist Ihre Beobachtung genau richtig:
Jede Funktion kann als "Tabellenfunktion" in der
FROM
Liste verwendet werden. Und Funktionsparameter können auf Spalten aus allen Tabellen links von der Funktion verweisen, da die Notation:ist wirklich äquivalent zu:
Das Handbuch zu LATERAL-Abfragen:
Meine kühne Betonung.
Das Schlüsselwort
AS
ist vollständig optionales Rauschen vor Tabellenaliasen (im Gegensatz zu Spaltenaliasen , bei denen empfohlen wird, es nicht auszulassenAS
, um mögliche Mehrdeutigkeiten zu vermeiden). Verwandte Antwort mit mehr:quelle