Itu menciptakan implisit CROSS JOIN
. Ini adalah sintaks SQL-89.
Di sini saya menggunakan values(1)
dan values(2)
membuat tabel pseduo (tabel nilai) hanya untuk contoh. Hal setelah mereka t(x)
, dan g(y)
disebut DARI-Alias karakter di dalam tanda kurung adalah alias untuk kolom ( x
dan y
masing - masing). Anda bisa dengan mudah membuat tabel untuk menguji ini.
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
Beginilah cara Anda menulisnya sekarang.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
Dari sana Anda dapat menjadikan ini suatu implisit INNER JOIN
dengan menambahkan sebuah kondisional.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
Atau INNER JOIN
sintaksis eksplisit dan baru ,
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
Jadi, dalam contoh Anda ..
FROM apod, to_tsquery('neutrino|(dark & matter)') query
Ini pada dasarnya sama dengan sintaks yang lebih baru,
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
yang sebenarnya sama, dalam hal ini, karena to_tsquery()
mengembalikan baris dan bukan set,
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;
Namun, hal di atas berpotensi menyebabkan to_tsquery('neutrino|(dark & matter)')
terjadi dua kali, tetapi dalam kasus ini tidak - to_tsquery
ditandai sebagai STABIL (diverifikasi dengan \dfS+ to_tsquery
).
STABLE
menunjukkan bahwa fungsi tidak dapat memodifikasi database, dan bahwa dalam pemindaian tabel tunggal itu akan secara konsisten mengembalikan hasil yang sama untuk nilai argumen yang sama, tetapi hasilnya dapat berubah di seluruh pernyataan SQL. Ini adalah pilihan yang sesuai untuk fungsi yang hasilnya tergantung pada pencarian basis data, variabel parameter (seperti zona waktu saat ini), dll. (Ini tidak pantas untuk pemicu SETELAH yang ingin meminta baris yang dimodifikasi oleh perintah saat ini.) Juga perhatikan bahwa current_timestamp keluarga fungsi memenuhi syarat sebagai stabil, karena nilainya tidak berubah dalam suatu transaksi.
Untuk perbandingan yang lebih lengkap dari perbedaan antara SQL-89, dan SQL-92, lihat juga jawaban saya di sini
,
menjadi cross join karena itu hanya produk Cartesian dan tidak ada perbandingan yang terlibat. Bisakah Anda menjawab 1 pertanyaan lagi TOLONG? apa yangt(x)
di(values(1)) AS t(x)
???