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)
???