暗黙的なを作成しCROSS JOIN
ます。SQL-89構文です。
ここではvalues(1)
、values(2)
単に例としてpseduo-table(値テーブル)を使用して作成しています。それらの後の事t(x)
、とg(y)
呼ばれているFROM-別名括弧内の文字列(の別名であるx
とy
、それぞれ)。これをテストするためのテーブルを簡単に作成できます。
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
ここにあなたが今それを書く方法があります。
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
そこからINNER JOIN
条件を追加することでこれを暗黙的にすることができます。
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
または、明示的で新しいINNER JOIN
構文、
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
あなたの例では..
FROM apod, to_tsquery('neutrino|(dark & matter)') query
これは基本的に新しい構文と同じですが、
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
実際には同じです。この場合、to_tsquery()
セットではなく行を返すため、
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;
ただし、上記は潜在的にto_tsquery('neutrino|(dark & matter)')
2回発生する可能性がありますが、この場合は発生しません-STABLE(で検証済み)to_tsquery
としてマークされます。\dfS+ to_tsquery
STABLE
関数はデータベースを変更できず、単一のテーブルスキャン内で同じ引数値に対して一貫して同じ結果を返しますが、その結果はSQLステートメント間で変わる可能性があることを示します。これは、結果がデータベースルックアップ、パラメーター変数(現在のタイムゾーンなど)などに依存する関数に適した選択です(現在のコマンドで変更された行を照会するAFTERトリガーには不適切です)。関数のcurrent_timestampファミリは、値がトランザクション内で変化しないため、安定していると見なされます。
SQL-89とSQL-92の違いのより完全な比較については、こちらの回答も参照してください。
,
デカルト積であり、比較は含まれていないため、クロス結合であることが理にかなっています。もう1つ質問してください。何t(x)
で(values(1)) AS t(x)
?