[TỪ x, y] có nghĩa là gì trong Postgres?


12

Tôi mới bắt đầu với Postgres. Đọc tài liệu này tôi đã xem qua truy vấn này:

SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;

Tôi có thể hiểu mọi thứ trong truy vấn này, ngoại trừ điều này : FROM apod, ....

Điều này ,có nghĩa là gì? Tôi đã quen tham gia nhưng không tham gia nhiều FROMcâu lệnh được phân tách bằng dấu phẩy.

Tôi đã tìm kiếm trên mạng không có kết quả. Sau khi nhìn vào nó và suy nghĩ, dường như với tôi rằng nó đang khai báo một biến gọi là truy vấn để nó có thể sử dụng nó nhiều lần. Nhưng nếu điều này là đúng, thì nó phải làm gì FROM?

Câu trả lời:


10

Nó tạo ra một ẩn CROSS JOIN. Đó là cú pháp SQL-89.

Ở đây tôi sử dụng values(1)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 ( xytươ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 JOINbằ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 JOINcú 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).

STABLEchỉ 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


Cảm ơn rât nhiều. Tôi chỉ mới bắt đầu với SQL. Thật ý nghĩa khi ,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)???
andrerpena

@andrerpena cập nhật.
Evan Carroll

1
bạn là nhất. Pha lê giải thích rõ ràng. Cảm ơn rất nhiều.
andrerpena

Không bao giờ nghe cụm từ "TỪ bí danh" cho một bí danh bảng . to_tsquery()trả về một giá trị không phải là một hàng . Và chỉ vì một hàm được định nghĩa STABLE, điều đó không có nghĩa là trình hoạch định truy vấn sẽ tránh đánh giá lặp lại. Nó có thể .
Erwin Brandstetter

12

Hướng dẫn có giải thích chi tiết về dấu phẩy trong FROMdanh sách trong chương Biểu thức bảng :

Điều FROMkhoản xuất phát một bảng từ một hoặc nhiều bảng khác được đưa ra trong danh sách tham chiếu bảng được phân tách bằng dấu phẩy.

FROM table_reference [, table_reference [, ...]]

Tham chiếu bảng có thể là tên bảng (có thể đủ tiêu chuẩn lược đồ) hoặc bảng dẫn xuất như truy vấn con, JOINcấu trúc hoặc kết hợp phức tạp của các bảng này. Nếu có nhiều hơn một tham chiếu bảng được liệt kê trong FROMmệnh đề, các bảng được nối với nhau (nghĩa là, sản phẩm Cartesian của các hàng của chúng được hình thành; xem bên dưới).

Thực tế là các tham chiếu bảng được phân tách bằng dấu phẩy đã được xác định trong phiên bản trước của tiêu chuẩn SQL so với JOINcú pháp rõ ràng không làm cho dấu phẩy sai hoặc lỗi thời. Sử dụng cú pháp nối rõ ràng, khi cần thiết về mặt kỹ thuật (xem bên dưới) hoặc nơi nó làm cho văn bản truy vấn rõ ràng hơn.

Hướng dẫn sử dụng một lần nữa:

FROM T1 CROSS JOIN T2tương đương với FROM T1 INNER JOIN T2 ON TRUE (xem bên dưới). Nó cũng tương đương với FROM T1, T2.

Nhưng "tương đương" không có nghĩa là giống hệt nhau . Có một sự khác biệt tinh tế, như các ghi chú thủ công :

Lưu ý
Tương đương sau này không giữ chính xác khi có nhiều hơn hai bảng xuất hiện, vì JOINliên kết chặt chẽ hơn dấu phẩy. Ví dụ FROM T1 CROSS JOIN T2 INNER JOIN T3 ON conditionkhông giống như FROM T1, T2 INNER JOIN T3 ON conditionconditioncó thể tham chiếu T1trong trường hợp đầu tiên nhưng không phải là tham chiếu thứ hai.

Câu hỏi liên quan này cho thấy sự liên quan của sự khác biệt:

Về cơ bản, quan sát của bạn là chính xác:

Dường như với tôi rằng nó đang khai báo một biến gọi là truy vấn để nó có thể sử dụng nó nhiều lần.

Bất kỳ chức năng có thể được sử dụng như "chức năng bảng" trong FROMdanh sách. Và các tham số hàm có thể tham chiếu các cột từ tất cả các bảng ở bên trái của hàm, bởi vì ký hiệu:

FROM apod, to_tsquery('neutrino|(dark & matter)') query

thực sự tương đương với:

FROM apod CROSS JOIN LATERAL to_tsquery('neutrino|(dark & matter)') AS query

Hướng dẫn về truy vấn LATITH:

Các hàm bảng xuất hiện trong FROMcũng có thể được bắt đầu bằng từ khóa LATERAL, nhưng đối với các hàm, từ khóa là tùy chọn ; các đối số của hàm có thể chứa các tham chiếu đến các cột được cung cấp bởi các mục TỪ trước trong mọi trường hợp.

Nhấn mạnh đậm của tôi.

Các từ khóaAS là hoàn toàn tùy chọn tiếng ồn trước khi bí danh bảng (như trái ngược với bí danh cột , nơi nó được đề nghị không bỏ qua ASđể tránh sự mơ hồ có thể). Câu trả lời liên quan với nhiều hơn:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.