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)
???to_tsquery()
mengembalikan nilai bukan baris . Dan hanya karena suatu fungsi didefinisikanSTABLE
, itu tidak berarti perencana permintaan akan menghindari evaluasi berulang. Itu bisa .Manual memiliki penjelasan terperinci untuk koma dalam
FROM
daftar di bab Ekspresi Tabel :Fakta bahwa referensi tabel yang dipisahkan koma telah didefinisikan dalam versi standar SQL yang lebih lama daripada
JOIN
sintaksis eksplisit tidak membuat koma salah atau ketinggalan zaman. Gunakan sintaks gabungan eksplisit, di mana secara teknis diperlukan (lihat di bawah) atau di mana itu membuat teks kueri lebih jelas.Manual lagi:
Tetapi "setara" tidak berarti identik . Ada perbedaan yang halus, seperti catatan manual :
Pertanyaan terkait ini menunjukkan relevansi perbedaan:
Pada dasarnya, pengamatan Anda benar:
Fungsi apa pun dapat digunakan sebagai "fungsi tabel" dalam
FROM
daftar. Dan parameter fungsi dapat merujuk kolom dari semua tabel ke kiri fungsi, karena notasi:benar-benar setara dengan:
Manual tentang permintaan LATERAL:
Penekanan berani saya.
Kata kunci
AS
tersebut benar-benar bunyi opsional sebelum alias tabel (sebagai lawan dari alias kolom , di mana disarankan untuk tidak menghilangkanAS
untuk menghindari kemungkinan ambiguitas). Jawaban terkait dengan lebih banyak:sumber