Tworzy to domniemanie CROSS JOIN
. To jest składnia SQL-89.
Tutaj używam values(1)
i values(2)
do tworzenia tabel pseduo (tabel wartości) jedynie dla przykładów. Rzecz po nich t(x)
, g(y)
zwana FROM-Aliasami, znak w nawiasie to alias dla kolumny ( x
i y
odpowiednio). Równie łatwo możesz utworzyć tabelę, aby to przetestować.
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
Oto, jak byś to teraz napisał.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
Stamtąd możesz uczynić to domyślnym INNER JOIN
poprzez dodanie warunkowego.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
Lub jawna i nowsza INNER JOIN
składnia,
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
W twoim przykładzie ..
FROM apod, to_tsquery('neutrino|(dark & matter)') query
Jest to w zasadzie to samo co nowsza składnia,
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
co w rzeczywistości jest w tym przypadku takie samo, ponieważ to_tsquery()
zwraca wiersz, a nie zestaw jako,
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;
Jednak powyższe może potencjalnie to_tsquery('neutrino|(dark & matter)')
wystąpić dwukrotnie, ale w tym przypadku tak się nie dzieje - to_tsquery
jest oznaczone jako STABILNE (weryfikowane za pomocą \dfS+ to_tsquery
).
STABLE
wskazuje, że funkcja nie może zmodyfikować bazy danych i że podczas skanowania pojedynczej tabeli konsekwentnie zwróci ten sam wynik dla tych samych wartości argumentów, ale jej wynik może ulec zmianie w instrukcjach SQL. Jest to odpowiedni wybór dla funkcji, których wyniki zależą od wyszukiwania w bazie danych, zmiennych parametrów (takich jak bieżąca strefa czasowa) itp. (Jest nieodpowiedni dla wyzwalaczy AFTER, które chcą zapytać o wiersze zmodyfikowane przez bieżące polecenie.) Należy również pamiętać, że rodzina funkcji current_timestamp kwalifikuje się jako stabilna, ponieważ ich wartości nie zmieniają się w ramach transakcji.
Aby uzyskać pełniejsze porównanie różnic między SQL-89 i SQL-92, zobacz także moją odpowiedź tutaj
,
jako połączenie krzyżowe, ponieważ jest to tylko produkt kartezjański i nie ma w tym porównania. Czy możesz po prostu odpowiedzieć na jeszcze 1 pytanie PROSZĘ? co jestt(x)
w(values(1)) AS t(x)
??