Phiên bản được hỗ trợ:hiện tại(17)16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

7.8.vớiTruy kèo bóng đá hôm nay và ngày mai (biểu thức bảng chung)#

vớiCung cấp một cách để viết các câu lệnh phụ trợ để sử dụng trong một truy kèo bóng đá hôm nay và ngày mai lớn hơn. Những câu lệnh này, thường được gọi là biểu thức bảng phổ biến hoặcCTEs, có thể được coi là xác định các bảng tạm thời tồn tại chỉ cho một truy kèo bóng đá hôm nay và ngày mai. Mỗi câu lệnh phụ trợ trong mộtvớimệnh đề có thể là mộtChọn, Chèn, Cập nhật, XóahoặcHợp nhất; vàvớimệnh đề được gắn kèo bóng đá hôm nay và ngày maio một câu lệnh chính cũng có thể là mộtChọn, Chèn, Cập nhật, XóahoặcHợp nhất.

7.8.1.Chọninvới #

Giá trị cơ bản củaChọninvớilà chia nhỏ các truy kèo bóng đá hôm nay và ngày mai phức tạp thành các phần đơn giản hơn. Một ví dụ là:

với khu vực_sales AS (

Hiển thị tổng doanh số trên mỗi sản phẩm chỉ trong kèo bóng đá hôm nay và ngày mai khu vực bán hàng hàng đầu. Thevớimệnh đề xác định hai câu lệnh phụ trợ có tênkhu vực_salesTop_Regions, trong đó đầu ra củakhu vực_salesđược sử dụng trongTop_Regionsvà đầu ra củaTop_Regionsđược sử dụng trong chínhChọnTruy kèo bóng đá hôm nay và ngày mai. Ví dụ này có thể đã được viết mà không cóvới, nhưng chúng tôi đã cần hai cấp độ phụ-Chọns. Theo cách này dễ dàng hơn một chút.

7.8.2. Truy kèo bóng đá hôm nay và ngày mai đệ quy#

Tùy chọnđệ quyThay đổi công cụ sửa đổivớiTừ một sự thuận tiện của cú pháp thành một tính năng hoàn thành mọi thứ không thể có trong SQL tiêu chuẩn. Sử dụngKiểu đệ quy, AvớiTruy kèo bóng đá hôm nay và ngày mai có thể tham khảo đầu ra của chính nó. Một ví dụ rất đơn giản là truy kèo bóng đá hôm nay và ngày mai này để tổng hợp các số nguyên từ 1 đến 100:

với đệ quy t (n) là (

Hình thức chung của một đệ quyvớiTruy kèo bóng đá hôm nay và ngày mai luôn làThuật ngữ không nhận được, sau đóUnion(hoặcLiên minh tất cả), sau đó aThuật ngữ đệ quy, trong đó chỉ có thuật ngữ đệ quy có thể chứa một tham chiếu đến đầu ra của truy kèo bóng đá hôm nay và ngày mai. Một truy kèo bóng đá hôm nay và ngày mai như vậy được thực thi như sau:

Đánh giá truy kèo bóng đá hôm nay và ngày mai đệ quy

  1. Đánh giá thuật ngữ không nhận được. VìUnion(nhưng khôngLiên minh tất cả), loại bỏ các hàng trùng lặp. Bao gồm tất cả các hàng còn lại trong kết quả của truy kèo bóng đá hôm nay và ngày mai đệ quy và cũng đặt chúng vào tạm thờiBảng làm việc.

  2. Miễn là bảng làm việc không trống, hãy lặp lại kèo bóng đá hôm nay và ngày mai bước sau:

    1. Đánh giá thuật ngữ đệ quy, thay thế kèo bóng đá hôm nay và ngày mai nội dung hiện tại của bảng làm việc cho sự tự tham chiếu đệ quy. VìUnion(nhưng khôngUnion all), loại bỏ các hàng và hàng trùng lặp sao chép bất kỳ hàng kết quả trước đó. Bao gồm tất cả các hàng còn lại trong kết quả của truy kèo bóng đá hôm nay và ngày mai đệ quy và cũng đặt chúng vào tạm thờiBảng trung gian.

    2. Thay thế nội dung của bảng làm việc bằng nội dung của bảng trung gian, sau đó làm trống bảng trung gian.

Lưu ý

trong khiKiểu đệ quycho phép các truy kèo bóng đá hôm nay và ngày mai được chỉ định đệ quy, bên trong các truy kèo bóng đá hôm nay và ngày mai như vậy được đánh giá lặp đi lặp lại.

Trong ví dụ trên, bảng làm việc chỉ có một hàng duy nhất trong mỗi bước và nó có kèo bóng đá hôm nay và ngày mai giá trị từ 1 đến 100 trong kèo bóng đá hôm nay và ngày mai bước liên tiếp. Trong bước thứ 100, không có đầu ra vìWHEREmệnh đề, và do đó truy kèo bóng đá hôm nay và ngày mai chấm dứt.

Các truy kèo bóng đá hôm nay và ngày mai đệ quy thường được sử dụng để xử lý dữ liệu phân cấp hoặc có cấu trúc cây. Một ví dụ hữu ích là truy kèo bóng đá hôm nay và ngày mai này để tìm tất cả các phần phụ trực tiếp và gián tiếp của sản phẩm, chỉ được cung cấp một bảng hiển thị các vùi ngay lập tức:

với đệ quy bao gồm_parts (sub_part, part, số lượng) là (

7.8.2.2. Phát hiện chu kỳ#

Khi làm việc với các truy kèo bóng đá hôm nay và ngày mai đệ quy, điều quan trọng là phải chắc chắn rằng phần đệ quy của truy kèo bóng đá hôm nay và ngày mai cuối cùng sẽ không trả lời không, nếu không thì truy kèo bóng đá hôm nay và ngày mai sẽ lặp lại vô thời hạn. Đôi khi, sử dụngLiên minhthay vìLiên minh tất cảCó thể thực hiện điều này bằng cách loại bỏ kèo bóng đá hôm nay và ngày mai hàng trùng lặp kèo bóng đá hôm nay và ngày mai hàng đầu ra trước đó. Tuy nhiên, thường thì một chu kỳ không liên quan đến kèo bóng đá hôm nay và ngày mai hàng đầu ra hoàn toàn trùng lặp: có thể cần phải kiểm tra chỉ một hoặc một vài trường để xem liệu cùng một điểm đã đạt được trước đó.đồ thịSử dụng ALinktrường:

với search_graph (id, liên kết, dữ liệu, độ sâu) là (

Truy kèo bóng đá hôm nay và ngày mai này sẽ lặp lại nếulinkMối quan hệ chứa chu kỳ. Bởi vì chúng tôi yêu cầuĐộ sâuHồiđầu ra, chỉ thay đổiUnion allđếnUnionsẽ không loại bỏ vòng lặp. Thay kèo bóng đá hôm nay và ngày maio đó, chúng ta cần nhận ra liệu chúng ta có đạt được cùng một hàng một lần nữa trong khi đi theo một đường dẫn liên kết cụ thể hay không.IS_CYCLEđường dẫnđến truy kèo bóng đá hôm nay và ngày mai dễ bị lặp lại:

với search_graph đệ quy (id, liên kết, dữ liệu, độ sâu,IS_CYCLE, đường dẫn) như (Sai,Từ đồ thị gg.id = any (| G.ID),Từ đồ thị G, search_graph SGvà không is_cycle)

Ngoài kèo bóng đá hôm nay và ngày mai chu kỳ ngăn chặn, giá trị mảng thường hữu ích theo cách riêng của nó như là đại diện chođường dẫnHồiĐược thực hiện để đạt được bất kỳ hàng cụ thể nào.

Trong trường hợp chung trong đó cần kiểm tra nhiều hơn một trường để nhận ra một chu kỳ, hãy sử dụng một mảng hàng. Ví dụ: nếu chúng ta cần so sánh kèo bóng đá hôm nay và ngày mai trườngF1f2:

với search_graph đệ quy (id, liên kết, dữ liệu, độ sâu,IS_CYCLE, | Hàng (g.f1, g.f2)) như (Sai,Từ đồ thị ghàng (g.f1, g.f2) = any (| Hàng (g.f1, g.f2)),Từ đồ thị G, search_graph SGvà không is_cycle)

TIP

bỏ quahàng ()Cú pháp trong trường hợp phổ biến trong đó chỉ cần kiểm tra một trường để nhận ra một chu kỳ. Điều này cho phép một mảng đơn giản thay vì sử dụng mảng loại tổng hợp, đạt được hiệu quả.

Có cú pháp tích hợp để đơn giản hóa phát hiện chu kỳ. Truy kèo bóng đá hôm nay và ngày mai trên cũng có thể được viết như thế này:

với search_graph (id, liên kết, dữ liệu, độ sâu) là (ID chu kỳ đặt is_cycle bằng đường dẫnChọn * từ search_graph;

Và nó sẽ được viết lại nội bộ theo mẫu trên. TheChu kỳĐiều khoản chỉ định đầu tiên danh sách kèo bóng đá hôm nay và ngày mai cột theo dõi phát hiện chu kỳ, sau đó một tên cột sẽ hiển thị liệu một chu kỳ đã được phát hiện và cuối cùng là tên của một cột khác sẽ theo dõi đường dẫn. kèo bóng đá hôm nay và ngày mai cột chu kỳ và đường dẫn sẽ hoàn toàn được thêm vào kèo bóng đá hôm nay và ngày mai hàng đầu ra của CTE.

tip

Cột | Hàng (g.f1, g.f2) chu kỳ được tính toán theo cách tương tự như cột thứ tự đầu tiên độ sâu hiển thị trong phần trước. Truy kèo bóng đá hôm nay và ngày mai có thể có cả ATìm kiếmvà AChu kỳ27249_27411Chu kỳmệnh đề và thứ tự theo cột | G.ID. Nếu muốn thứ tự đầu tiên được muốn, thì chỉ định cảTìm kiếmChu kỳcó thể hữu ích.

Một thủ thuật hữu ích để kiểm tra các truy kèo bóng đá hôm nay và ngày mai khi bạn không chắc chắn nếu chúng có thể lặp là đặt mộtGiới hạnTrong truy kèo bóng đá hôm nay và ngày mai cha mẹ. Ví dụ, truy kèo bóng đá hôm nay và ngày mai này sẽ lặp lại mãi mãi mà không cầngiới hạn:

với đệ quy t (n) là (Giới hạn 100;

Điều này hoạt động vìPostgreSQLS Triển khai chỉ đánh giá chỉ có nhiều hàng của AvớiTruy kèo bóng đá hôm nay và ngày mai như thực sự được tìm kiếm bởi truy kèo bóng đá hôm nay và ngày mai cha. Sử dụng thủ thuật này trong sản xuất không được khuyến khích, bởi vì các hệ thống khác có thể hoạt động khác nhau.vớiđầu ra của truy kèo bóng đá hôm nay và ngày mai.

7.8.3. Biểu thức bảng phổ biến vật chất hóa#

Một thuộc tính hữu ích củavớiTruy kèo bóng đá hôm nay và ngày mai là chúng thường được đánh giá chỉ một lần mỗi lần thực hiện truy kèo bóng đá hôm nay và ngày mai cha mẹ, ngay cả khi chúng được nhắc đến nhiều lần bởi truy kèo bóng đá hôm nay và ngày mai cha mẹ hoặc anh chị emvớiTruy kèo bóng đá hôm nay và ngày mai. Do đó, các tính toán đắt tiền cần thiết ở nhiều nơi có thể được đặt trong mộtvớiTruy kèo bóng đá hôm nay và ngày mai để tránh công việc dự phòng. Một ứng dụng khả thi khác là ngăn chặn nhiều đánh giá không mong muốn về các chức năng với tác dụng phụ.vớiTruy kèo bóng đá hôm nay và ngày mai, vì điều đó có thể ảnh hưởng đến tất cả việc sử dụngvớiđầu ra của truy kèo bóng đá hôm nay và ngày mai khi nó chỉ ảnh hưởng đến một. Tham khảo nhânvớiTruy kèo bóng đá hôm nay và ngày mai sẽ được đánh giá là viết, mà không cần triệt tiêu các hàng mà truy kèo bóng đá hôm nay và ngày mai cha mẹ có thể loại bỏ sau đó. (Nhưng, như đã đề cập ở trên, đánh giá có thể dừng sớm nếu (các) tham chiếu đến yêu cầu truy kèo bóng đá hôm nay và ngày mai chỉ có một số lượng hạn chế.)

Tuy nhiên, nếu AvớiTruy kèo bóng đá hôm nay và ngày mai không được nhận và không có tác dụng phụ (nghĩa là, đó là mộtChọnKhông chứa các chức năng dễ bay hơi) sau đó nó có thể được gấp lại vào truy kèo bóng đá hôm nay và ngày mai cha mẹ, cho phép tối ưu hóa khớp hai cấp truy kèo bóng đá hôm nay và ngày mai. Theo mặc định, điều này xảy ra nếu truy kèo bóng đá hôm nay và ngày mai cha mẹ tham chiếuvớiTruy kèo bóng đá hôm nay và ngày mai chỉ một lần, nhưng không phải nếu nó tham khảovớiTruy kèo bóng đá hôm nay và ngày mai nhiều lần. Bạn có thể ghi đè quyết định đó bằng cách chỉ địnhvật chất hóaĐể buộc tính toán riêng củavớiTruy kèo bóng đá hôm nay và ngày mai hoặc bằng cách chỉ địnhkhông được vật chất hóaĐể buộc nó được hợp nhất vào truy kèo bóng đá hôm nay và ngày mai cha mẹ. Lựa chọn sau có nguy cơ tính toán trùng lặp củavớiTruy kèo bóng đá hôm nay và ngày mai, nhưng nó vẫn có thể tiết kiệm ròng nếu mỗi lần sử dụngvớiTruy kèo bóng đá hôm nay và ngày mai chỉ cần một phần nhỏ củavớiđầu ra đầy đủ của truy kèo bóng đá hôm nay và ngày mai.

Một ví dụ đơn giản về kèo bóng đá hôm nay và ngày mai quy tắc này là

Với W AS (

thisvớiTruy kèo bóng đá hôm nay và ngày mai sẽ được gấp lại, tạo ra cùng một kế hoạch thực thi như

Chọn * từ Big_Table WHERE KEY = 123;

Đặc biệt, nếu có chỉ mục trênKey, nó có thể sẽ được sử dụng để tìm nạp kèo bóng đá hôm nay và ngày mai hàng cókey = 123. Mặt khác, trong

với W AS (

ThevớiTruy kèo bóng đá hôm nay và ngày mai sẽ được vật chất hóa, tạo ra một bản sao tạm thời củaBIG_TABLESau đó được kết hợp với chính nó - mà không có lợi ích của bất kỳ chỉ số nào. Truy kèo bóng đá hôm nay và ngày mai này sẽ được thực hiện hiệu quả hơn nhiều nếu được viết là

Với W không được vật chất hóa (

để có thể áp dụng trực tiếp các hạn chế của truy kèo bóng đá hôm nay và ngày mai cha mẹ để quétBIG_TABLE.

Một ví dụ trong đókhông được vật chất hóacó thể không mong muốn là

Với W AS (

Ở đây, vật chất hóavớiTruy kèo bóng đá hôm nay và ngày mai đảm bảo rằngrấtchỉ được đánh giá một lần cho mỗi hàng bảng, không hai lần.

kèo bóng đá hôm nay và ngày mai ví dụ trên chỉ hiển thịvớiđang được sử dụng vớiChọn, nhưng nó có thể được đính kèm theo cùng một cách vớiChèn, Cập nhật, XóahoặcHợp nhất. Trong mỗi trường hợp, nó cung cấp (kèo bóng đá hôm nay và ngày mai) bảng tạm thời có thể được đề cập trong lệnh chính.

7.8.4. kèo bóng đá hôm nay và ngày mai câu lệnh sửa đổi dữ liệu trongvới #

Bạn có thể sử dụng kèo bóng đá hôm nay và ngày mai câu lệnh biến đổi dữ liệu (Chèn, Cập nhật, Xóahoặchợp nhất) trongvới. Điều này cho phép bạn thực hiện một số hoạt động khác nhau trong cùng một truy kèo bóng đá hôm nay và ngày mai.

với di chuyển_rows AS (

Truy kèo bóng đá hôm nay và ngày mai này di chuyển hiệu quả các hàng từSản phẩmđếnSản phẩm_log. TheXóainvớiXóa kèo bóng đá hôm nay và ngày mai hàng được chỉ định khỏiSản phẩm, Trả lại nội dung của chúng bằng phương tiện của nóTrở vềmệnh đề; Và sau đó truy kèo bóng đá hôm nay và ngày mai chính đọc đầu ra đó và chèn nó vàoSản phẩm_log.

Một điểm tốt của ví dụ trên làvớimệnh đề được gắn kèo bóng đá hôm nay và ngày maioChèn, không phải phụ-ChọntrongChèn. Điều này là cần thiết vì kèo bóng đá hôm nay và ngày mai câu lệnh biến đổi dữ liệu chỉ được phép trongvớikèo bóng đá hôm nay và ngày mai điều khoản được gắn vào câu lệnh cấp cao nhất. Tuy nhiên, bình thườngvớiQuy tắc hiển thị áp dụng, vì vậy có thể tham khảovớiĐầu ra của câu lệnh từ Sub-Chọn.

Câu lệnh sửa đổi dữ liệu trongvớithường cóTrở vềmệnh đề (xemPhần 6.4), như được hiển thị trong ví dụ trên. Nó là đầu ra củaTrở vềmệnh đề,khôngBảng mục tiêu của câu lệnh biến đổi dữ liệu, tạo thành bảng tạm thời có thể được đề cập bởi phần còn lại của truy kèo bóng đá hôm nay và ngày mai. Nếu câu lệnh biến đổi dữ liệu trongvớithiếu ATrở vềmệnh đề, sau đó nó tạo thành không có bảng tạm thời và không thể được đề cập trong phần còn lại của truy kèo bóng đá hôm nay và ngày mai. Một tuyên bố như vậy sẽ được thực hiện dù sao.

với t As (

Ví dụ này sẽ xóa tất cả kèo bóng đá hôm nay và ngày mai hàng khỏi bảngfooBar. Số lượng kèo bóng đá hôm nay và ngày mai hàng bị ảnh hưởng được báo cáo cho khách hàng sẽ chỉ bao gồm kèo bóng đá hôm nay và ngày mai hàng bị xóa khỏiBar.

Không được phép tự giới thiệu trong kèo bóng đá hôm nay và ngày mai câu lệnh biến đổi dữ liệu. Trong một số trường hợp, có thể làm việc xung quanh giới hạn này bằng cách tham khảo đầu ra của một đệ quyvới, ví dụ:

với đệ quy bao gồm_parts (sub_part, part) là (

Truy kèo bóng đá hôm nay và ngày mai này sẽ xóa tất cả các phần phụ trực tiếp và gián tiếp của sản phẩm.

Câu lệnh sửa đổi dữ liệu trongvớiđược thực hiện chính xác một lần và luôn luôn hoàn thành, độc lập với việc truy kèo bóng đá hôm nay và ngày mai chính đọc tất cả (hoặc thực sự là bất kỳ) đầu ra của chúng. Lưu ý rằng điều này khác với quy tắc choChọninvới: Như đã nêu trong phần trước, thực hiện AChọnchỉ được thực hiện theo như truy kèo bóng đá hôm nay và ngày mai chính yêu cầu đầu ra của nó.

kèo bóng đá hôm nay và ngày mai tiểu thư trongvớiđược thực hiện đồng thời với nhau và với truy kèo bóng đá hôm nay và ngày mai chính. Do đó, khi sử dụng các câu lệnh biến đổi dữ liệu trongvới, thứ tự kèo bóng đá hôm nay và ngày mai bản cập nhật được chỉ định thực sự xảy ra là không thể đoán trước. Tất cả kèo bóng đá hôm nay và ngày mai câu lệnh được thực thi với cùng mộtSnapshot(xemChương 13), vì vậy họ không thểxemHiệu ứng của nhau trên kèo bóng đá hôm nay và ngày mai bảng đích. Điều này làm giảm bớt kèo bóng đá hôm nay và ngày mai tác động của sự khó lường của thứ tự thực tế của kèo bóng đá hôm nay và ngày mai bản cập nhật hàng và có nghĩa làTrở vềDữ liệu là cách duy nhất để kèo bóng đá hôm nay và ngày maiền đạt các thay đổi giữa các khác nhauvớiphụ và truy kèo bóng đá hôm nay và ngày mai chính. Một ví dụ về điều này là trong

với t AS (

bên ngoàiChọnSẽ trả lại giá ban đầu trước khi hành động củaCập nhật, trong khi ở

với t As (

bên ngoàiChọnSẽ trả về dữ liệu được cập nhật.

Cố gắng cập nhật cùng một hàng hai lần trong một câu không được hỗ trợ. Chỉ có một trong những sửa đổi diễn ra, nhưng nó không dễ dàng (và đôi khi không thể) để dự đoán một cách đáng tin cậy cái nào.vớikèo bóng đá hôm nay và ngày mai tiểu thư có thể ảnh hưởng đến cùng một hàng được thay đổi bởi câu lệnh chính hoặc một câu chuyện con anh chị em. kèo bóng đá hôm nay và ngày mai hiệu ứng của một tuyên bố như vậy sẽ không thể dự đoán được.

Hiện tại, bất kỳ bảng nào được sử dụng làm mục tiêu của câu lệnh biến đổi dữ liệu trongvớikhông được có quy tắc có điều kiện, cũng không phảicũngQuy tắc, cũng không phảiThay kèo bóng đá hôm nay và ngày maio đóQuy tắc mở rộng sang nhiều câu lệnh.

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớpMẫu nàyĐể báo cáo kèo bóng đá hôm nay và ngày mai đề tài liệu.