Crea un implicito CROSS JOIN
. È la sintassi SQL-89.
Qui uso values(1)
e values(2)
creo tabelle pseduo (tabelle di valori) solo per esempi. La cosa dopo di loro t(x)
, e g(y)
sono chiamati FROM-Alias, il carattere all'interno della parentesi è l'alias per la colonna ( x
e y
rispettivamente). È possibile creare altrettanto facilmente una tabella per verificarlo.
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
Ecco come lo scriveresti ora.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
Da lì puoi renderlo implicito INNER JOIN
aggiungendo un condizionale.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
O la INNER JOIN
sintassi esplicita e più recente ,
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
Quindi nel tuo esempio ..
FROM apod, to_tsquery('neutrino|(dark & matter)') query
Questo è essenzialmente lo stesso della sintassi più recente,
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
che in realtà è lo stesso, in questo caso, perché to_tsquery()
restituisce una riga e non un set come,
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;
Tuttavia, quanto sopra potrebbe potenzialmente to_tsquery('neutrino|(dark & matter)')
verificarsi due volte, ma in questo caso non to_tsquery
è - è contrassegnato come STABILE (verificato con \dfS+ to_tsquery
).
STABLE
indica che la funzione non può modificare il database e che all'interno di una singola scansione della tabella restituirà costantemente lo stesso risultato per gli stessi valori dell'argomento, ma che il suo risultato potrebbe cambiare attraverso le istruzioni SQL. Questa è la selezione appropriata per le funzioni i cui risultati dipendono dalle ricerche nel database, dalle variabili dei parametri (come il fuso orario corrente), ecc. (È inappropriato per i trigger AFTER che desiderano interrogare le righe modificate dal comando corrente.) Si noti inoltre che il La famiglia di funzioni current_timestamp si qualifica come stabile, poiché i loro valori non cambiano all'interno di una transazione.
Per un confronto più completo delle differenze tra SQL-89 e SQL-92, vedere anche la mia risposta qui
,
che si tratti di un cross join in quanto è solo un prodotto cartesiano e non sono previsti confronti. Puoi rispondere ad un'altra domanda PER FAVORE? cosa c'èt(x)
dentro(values(1)) AS t(x)
???