Nó tạo ra một ẩn CROSS JOIN
. Đó là cú pháp SQL-89.
Ở đây tôi sử dụng values(1)
và values(2)
để tạo các bảng pseduo (bảng giá trị) chỉ cho các ví dụ. Thứ theo sau chúng t(x)
, và g(y)
được gọi là TỪ-Bí danh , ký tự bên trong dấu ngoặc đơn là bí danh cho cột ( x
và y
tương ứng). Bạn có thể dễ dàng tạo một bảng để kiểm tra điều này.
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
Đây là cách bạn viết nó bây giờ.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
Từ đó bạn có thể biến điều này thành một ẩn ý INNER JOIN
bằng cách thêm một điều kiện.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
Hoặc INNER JOIN
cú pháp rõ ràng và mới hơn ,
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
Vì vậy, trong ví dụ của bạn ..
FROM apod, to_tsquery('neutrino|(dark & matter)') query
Điều này về cơ bản giống như cú pháp mới hơn,
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
trong trường hợp này thực sự giống nhau, vì to_tsquery()
trả về một hàng và không phải là một tập hợp như,
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;
Tuy nhiên, những điều trên có khả năng gây to_tsquery('neutrino|(dark & matter)')
ra hai lần, nhưng trong trường hợp này thì không - to_tsquery
được đánh dấu là ỔN ĐỊNH (được xác minh bằng \dfS+ to_tsquery
).
STABLE
chỉ ra rằng hàm không thể sửa đổi cơ sở dữ liệu và trong một lần quét bảng, nó sẽ trả về cùng một kết quả cho cùng các giá trị đối số, nhưng kết quả của nó có thể thay đổi trên các câu lệnh SQL. Đây là lựa chọn phù hợp cho các hàm có kết quả phụ thuộc vào tra cứu cơ sở dữ liệu, biến tham số (như múi giờ hiện tại), v.v. (Không phù hợp với trình kích hoạt SAU muốn truy vấn các hàng được sửa đổi bởi lệnh hiện tại.) Cũng lưu ý rằng họ các hàm current_timestamp đủ điều kiện là ổn định, vì các giá trị của chúng không thay đổi trong một giao dịch.
Để so sánh đầy đủ hơn về sự khác biệt giữa SQL-89 và SQL-92, xem thêm câu trả lời của tôi ở đây
,
tham gia chéo vì đây chỉ là một sản phẩm của Cartesian và không có sự so sánh nào liên quan. Bạn có thể trả lời thêm 1 câu hỏi không? có gìt(x)
trong(values(1)) AS t(x)
???