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)
??to_tsquery()
zwraca wartość, a nie wiersz . I tylko dlatego, że funkcja jest zdefiniowanaSTABLE
, to nie znaczy, planista zapytanie będzie uniknąć ponownej oceny. To możliwe .Podręcznik zawiera szczegółowe objaśnienie przecinka na
FROM
liście w rozdziale Wyrażenia tabelowe :Fakt, że odwołania do tabel oddzielone przecinkami zostały zdefiniowane we wcześniejszej wersji standardu SQL niż jawna
JOIN
składnia, nie powodują, że przecinek jest niepoprawny lub nieaktualny. Użyj jawnej składni sprzężenia, gdy jest to technicznie konieczne (patrz poniżej) lub gdy sprawia, że tekst zapytania jest wyraźniejszy.Instrukcja ponownie:
Ale „ekwiwalent” nie oznacza identyczności . Istnieje subtelna różnica, jak ręcznych notatek :
To powiązane pytanie pokazuje znaczenie różnicy:
Zasadniczo twoja obserwacja jest dokładnie słuszna:
Dowolną funkcję można wykorzystać jako „funkcję tabeli” na
FROM
liście. A parametry funkcji mogą odwoływać się do kolumn ze wszystkich tabel po lewej stronie funkcji, ponieważ notacja:jest naprawdę równoważny z:
Podręcznik dotyczący zapytań LATERAL:
Odważny nacisk moje.
Słowo kluczowe
AS
to całkowicie opcjonalny szum przed aliasami tabeli (w przeciwieństwie do aliasów kolumn , w których zaleca się, aby nie pomijać,AS
aby uniknąć ewentualnych dwuznaczności). Powiązana odpowiedź z więcej:źródło