Це створює неявне CROSS JOIN
. Це синтаксис SQL-89.
Тут я використовую values(1)
і values(2)
створюю пседу-таблиці (таблиці значень) лише для прикладів. Річ після них t(x)
, і g(y)
називається ВІД-Псевдонімом, символ всередині дужок є псевдонімом стовпця ( 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)')
виникнення двічі, але в цьому випадку це не так - to_tsquery
позначається як СТАБІЛЬНА (перевірена \dfS+ to_tsquery
).
STABLE
вказує на те, що функція не може змінювати базу даних, і що в межах однієї сканування таблиці вона послідовно повертає той самий результат для тих же значень аргументу, але що його результат може змінюватися в операторах SQL. Це відповідний вибір для функцій, результати яких залежать від пошуку в базі даних, змінних параметрів (таких як поточний часовий пояс) тощо. (Недоцільно ПІСЛЯ тригерів, які бажають запитувати рядки, змінені поточною командою.) Також зауважте, що Сімейство функцій current_timestamp кваліфікується як стабільне, оскільки їх значення не змінюються в межах транзакції.
Для більш повного порівняння відмінностей між SQL-89 та SQL-92 дивіться також мою відповідь тут
,
бути перехресним з'єднанням, оскільки це лише декартовий продукт, і порівняння тут не береться. Чи можете ви просто відповісти на ще одне запитання? щоt(x)
в(values(1)) AS t(x)
???