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
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

7.8.kèo bóng đá cúp c2kèo bóng đá cúp c2 (biểu thức bảng chung)

kèo bóng đá cúp c2Cung cấp một cách để viết các câu lệnh phụ trợ để sử dụng trong một kèo bóng đá cúp c2 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 kèo bóng đá cúp c2. Mỗi câu lệnh phụ trợ trong mộtkèo bóng đá cúp c2mệnh đề có thể là mộtChọn, Chèn, Cập nhậthoặcXóa; vàkèo bóng đá cúp c2mệnh đề được gắn vào một câu lệnh chính cũng có thể là mộtChọn, Chèn, Cập nhậthoặcXóa.

7.8.1.Chọninkèo bóng đá cúp c2

Giá trị cơ bản củaChọninkèo bóng đá cúp c2là chia nhỏ các kèo bóng đá cúp c2 phức tạp thành các phần đơn giản hơn. Một ví dụ là:

kèo bóng đá cúp c2 khu vực_sales AS (

Hiển thị tổng doanh số trên mỗi sản phẩm chỉ trong các khu vực bán hàng hàng đầu. Thekèo bóng đá cúp c2mệ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ọnkèo bóng đá cúp c2. Ví dụ này có thể đã được viết mà không cókèo bóng đá cúp c2, 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.

Tùy chọnKiểu đệ quyThay đổi công cụ sửa đổikèo bóng đá cúp c2Từ 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, Akèo bóng đá cúp c2kèo bóng đá cúp c2 có thể tham khảo đầu ra của chính nó. Một ví dụ rất đơn giản là kèo bóng đá cúp c2 này để tổng hợp các số nguyên từ 1 đến 100:

kèo bóng đá cúp c2 đệ quy t (n) là (

Hình thức chung của một đệ quykèo bóng đá cúp c2kèo bóng đá cúp c2 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 mới có thể chứa một tham chiếu đến đầu ra của kèo bóng đá cúp c2. Một kèo bóng đá cúp c2 như vậy được thực thi như sau:

Đánh giá kèo bóng đá cúp c2 đệ 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 kèo bóng đá cúp c2 đệ 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 các bước sau:

    1. Đánh giá thuật ngữ đệ quy, thay thế các 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ôngLiên minh tất cả), 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 kèo bóng đá cúp c2 đệ 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 đó xóa bảng trung gian.

ghi chú

trong khiđệ quyCho phép các kèo bóng đá cúp c2 được chỉ định đệ quy, bên trong các kèo bóng đá cúp c2 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ó các giá trị từ 1 đến 100 trong các bước liên tiếp. Trong bước thứ 100, không có đầu ra vìWHEREmệnh đề, và vì vậy kèo bóng đá cúp c2 chấm dứt.

kèo bóng đá cúp c2 đệ 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à kèo bóng đá cúp c2 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:

kèo bóng đá cúp c2 đệ quy bao gồm_parts (sub_part, part, số lượng) là (

Khi làm việc với các kèo bóng đá cúp c2 đệ quy, điều quan trọng là phải chắc chắn rằng phần đệ quy của kèo bóng đá cúp c2 cuối cùng sẽ không trả lời được, nếu không thì kèo bóng đá cúp c2 sẽ lặp lại vô thời hạn. Đôi khi, sử dụngUnionthay vìLiên minh tất cảCó thể thực hiện điều này bằng cách loại bỏ các hàng trùng lặp các hàng đầu ra trước đó. Tuy nhiên, thường thì một chu kỳ không liên quan đến các 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:

kèo bóng đá cúp c2 search_graph (id, liên kết, dữ liệu, độ sâu) là (

kèo bóng đá cúp c2 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âuđầu ra, chỉ thay đổiLiên minh tất cảđếnUnionsẽ không loại bỏ vòng lặp. Thay vào đó, 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 | Hàng (G.F1, G.F2), liên kết cụ thể hay không.PathChu kỳđến kèo bóng đá cúp c2 dễ bị lặp lại:

kèo bóng đá cúp c2 search_graph (id, liên kết, dữ liệu, độ sâu, | g.id,, chu kỳ) là (

Ngoài các 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 choPathHồ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 các trườngF1F2:

kèo bóng đá cúp c2 search_graph (id, liên kết, dữ liệu, độ sâu, | Hàng (G.F1, G.F2),, chu kỳ) là (

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ả.

Tip

Thuật toán đánh giá kèo bóng đá cúp c2 đệ quy tạo ra đầu ra của nó theo thứ tự tìm kiếm đầu tiên trên chiều rộng. Bạn có thể hiển thị kết quả theo thứ tự tìm kiếm đầu tiên bằng cách thực hiện kèo bóng đá cúp c2 bên ngoàiĐặt hàng bởiAHồiđường dẫnxôngCột được xây dựng theo cách này.

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

kèo bóng đá cúp c2 đệ quy t (n) là (

Điều này hoạt động vìPostgreSQLS Thực hiện chỉ đánh giá bằng nhiều hàng của Akèo bóng đá cúp c2kèo bóng đá cúp c2 như thực sự được tìm kiếm bởi kèo bóng đá cúp c2 cha mẹ. 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.kèo bóng đá cúp c2đầu ra của kèo bóng đá cúp c2.

Một thuộc tính hữu ích củakèo bóng đá cúp c2kèo bóng đá cúp c2 là chúng thường chỉ được đánh giá một lần mỗi lần thực hiện kèo bóng đá cúp c2 cha mẹ, ngay cả khi chúng được nhắc đến nhiều lần bởi kèo bóng đá cúp c2 cha mẹ hoặc anh chị emkèo bóng đá cúp c2kèo bóng đá cúp c2. Do đó, các tính toán đắt tiền cần thiết ở nhiều nơi có thể được đặt trong mộtkèo bóng đá cúp c2kèo bóng đá cúp c2 để 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ụ.kèo bóng đá cúp c2kèo bóng đá cúp c2, vì điều đó có thể ảnh hưởng đến tất cả việc sử dụngkèo bóng đá cúp c2đầu ra của kèo bóng đá cúp c2 khi nó chỉ ảnh hưởng đến một. Tham khảo nhânkèo bóng đá cúp c2kèo bóng đá cúp c2 sẽ được đánh giá là viết, mà không cần triệt tiêu các hàng mà kèo bóng đá cúp c2 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 kèo bóng đá cúp c2 chỉ có một số lượng hạn chế.)

Tuy nhiên, nếu Akèo bóng đá cúp c2kèo bóng đá cúp c2 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 kèo bóng đá cúp c2 của cha mẹ, cho phép tối ưu hóa khớp hai mức kèo bóng đá cúp c2. Theo mặc định, điều này xảy ra nếu kèo bóng đá cúp c2 cha mẹ tham chiếukèo bóng đá cúp c2kèo bóng đá cúp c2 chỉ một lần, nhưng không nếu nó tham khảokèo bóng đá cúp c2kèo bóng đá cúp c2 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ủakèo bóng đá cúp c2kèo bóng đá cúp c2 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 kèo bóng đá cúp c2 cha mẹ. Lựa chọn sau có nguy cơ tính toán trùng lặp củakèo bóng đá cúp c2kèo bóng đá cúp c2, nhưng nó vẫn có thể tiết kiệm ròng nếu mỗi lần sử dụngkèo bóng đá cúp c2kèo bóng đá cúp c2 chỉ cần một phần nhỏ củakèo bóng đá cúp c2đầu ra đầy đủ của kèo bóng đá cúp c2.

Một ví dụ đơn giản về các quy tắc này là

kèo bóng đá cúp c2 W AS (

thiskèo bóng đá cúp c2kèo bóng đá cúp c2 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 các hàng cókey = 123. Mặt khác, trong

kèo bóng đá cúp c2 W AS (

Thekèo bóng đá cúp c2kèo bóng đá cúp c2 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. kèo bóng đá cúp c2 này sẽ được thực hiện hiệu quả hơn nhiều nếu được viết là

kèo bóng đá cúp c2 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 kèo bóng đá cúp c2 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à

kèo bóng đá cúp c2 W AS (

Ở đây, vật chất hóakèo bóng đá cúp c2kèo bóng đá cúp c2 đả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.

Các ví dụ trên chỉ hiển thịkèo bóng đá cúp c2đang được sử dụng kèo bóng đá cúp c2Chọn, nhưng nó có thể được đính kèm theo cùng một cách kèo bóng đá cúp c2Chèn, Cập nhậthoặcXóa. Trong mỗi trường hợp, nó cung cấp (các) bảng tạm thời có thể được đề cập trong lệnh chính.

7.8.2. Các câu lệnh sửa đổi dữ liệu trongkèo bóng đá cúp c2

Bạn có thể sử dụng các câu lệnh biến đổi dữ liệu (Chèn, Cập nhậthoặcXóa) trongkèo bóng đá cúp c2. Đ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 kèo bóng đá cúp c2.

kèo bóng đá cúp c2 di chuyển_rows AS (

kèo bóng đá cúp c2 này di chuyển hiệu quả các hàng từSản phẩmđếnProducts_log. TheXóainkèo bóng đá cúp c2Xóa các 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 đó kèo bóng đá cúp c2 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àkèo bóng đá cúp c2mệnh đề được gắn vàoChèn, không phải phụ-ChọntrongChèn. Điều này là cần thiết vì các câu lệnh biến đổi dữ liệu chỉ được phép trongkèo bóng đá cúp c2Các điều khoản được gắn vào câu lệnh cấp cao nhất. Tuy nhiên, bình thườngkèo bóng đá cúp c2Quy tắc hiển thị áp dụng, vì vậy có thể tham khảokèo bóng đá cúp c2Đầu ra của câu lệnh từ Sub-Chọn.

Câu lệnh sửa đổi dữ liệu trongkèo bóng đá cúp c2thường cóTrở về27540_27556Phần 6.4), như thể hiện 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 kèo bóng đá cúp c2. Nếu câu lệnh biến đổi dữ liệu trongkèo bóng đá cúp c2thiế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 kèo bóng đá cúp c2. Một tuyên bố như vậy sẽ được thực hiện dù sao.

kèo bóng đá cúp c2 T AS (

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

Không được phép tự giới thiệu trong các 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 đệ quykèo bóng đá cúp c2, ví dụ:

kèo bóng đá cúp c2 đệ quy bao gồm_parts (sub_part, part) là (

kèo bóng đá cúp c2 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 trongkèo bóng đá cúp c2đượ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 kèo bóng đá cúp c2 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ọninkèo bóng đá cúp c2: Như đã nêu trong phần trước, thực hiện AChọnchỉ được thực hiện theo như kèo bóng đá cúp c2 chính yêu cầu đầu ra của nó.

Các tiểu thư trongkèo bóng đá cúp c2được thực hiện đồng thời với nhau và với kèo bóng đá cúp c2 chính. Do đó, khi sử dụng các câu lệnh biến đổi dữ liệu trongkèo bóng đá cúp c2, thứ tự các 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ả các câu lệnh được thực thi kèo bóng đá cúp c2 cùng mộtSnapshot(xemChương 13), vì vậy họ không thểxemHiệu ứng của nhau trên các bảng đích. Điều này làm giảm bớt các tác động của sự khó lường của thứ tự thực tế của các 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 đá cúp c2ền đạt các thay đổi giữa các khác nhaukèo bóng đá cúp c2Tiểu phụ và kèo bóng đá cúp c2 chính. Một ví dụ về điều này là trong

kèo bóng đá cúp c2 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 ở

kèo bóng đá cúp c2 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.kèo bóng đá cúp c2Các tiểu bang có thể ảnh hưởng đến cùng một hàng thay đổi bởi câu lệnh chính hoặc một câu chuyện con anh chị em. Các 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 trongkèo bóng đá cúp c2khô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 vào đóQuy tắc mở rộng sang nhiều câu lệnh.