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ách đọc kèo bóng đá phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

7.8.cách đọc kèo bóng đácách đọc kèo bóng đá (bảng chung Biểu thức)

cách đọc kèo bóng đá9802_9960CTEs, có thể được coi là Xác định các bảng tạm thời tồn tại chỉ cho một cách đọc kèo bóng đá. Mỗi Tuyên bố phụ trợ trong Acách đọc kèo bóng đámệnh đề có thể là AChọn, Chèn, Cập nhậthoặcXóa; vàcách đọc kèo bóng đámệnh đề được gắn vào một chính tuyên bố cũng có thể là mộtChọn, Chèn, Cập nhật, hoặcXóa.

7.8.1.Chọnincách đọc kèo bóng đá

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

cách đọc kèo bóng đá khu vực_sales AS (
        Chọn vùng, tổng (số lượng) là Total_sales
        Từ đơn đặt hàng
        Theo từng khu vực
     ), top_regions là (
        Chọn vùng
        Từ khu vực_sales
        Trong đó Total_Sales (chọn Sum (Total_Sales)/10 từ khu vực_sales)
     )
Chọn Vùng,
       sản phẩm,
       Tổng (số lượng) là sản phẩm_units,
       Tổng (số lượng) dưới dạng sản phẩm_sales
Từ đơn đặt hàng
Nơi vùng trong (chọn Vùng từ Top_Regions)
Theo từng khu vực, sản phẩm;

Hiển thị tổng doanh số của mỗi sản phẩm chỉ ở đầu khu vực bán hàng. Thecách đọc kèo bóng đáĐịnh nghĩa định nghĩa 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ọncách đọc kèo bóng đá. Ví dụ này có thể đã được được viết mà khôngcách đọc kèo bóng đá, nhưng chúng tôi có cần hai cấp độ phụ-Chọns. Nó dễ dàng hơn một chút để theo dõi điều này đường.

Tùy chọnđệ quyCông cụ sửa đổi Thay đổicách đọc kèo bóng đáTừ một cú pháp đơn thuần thuận tiện vào một tính năng hoàn thành mọi thứ không nếu không có thể trong SQL tiêu chuẩn. Sử dụngKiểu đệ quy, Acách đọc kèo bóng đá12474_12595

cách đọc kèo bóng đá đệ quy t (n) là (
    Giá trị (1)
  Liên minh tất cả
    Chọn n+1 từ t trong đó n <100
)
Chọn Sum (n) từ t;

Hình thức chung của một đệ quycách đọc kèo bóng đácách đọc kèo bóng đá 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 chính cách đọc kèo bóng đá đầu ra. Một cách đọc kèo bóng đá như vậy được thực thi như sau:

Đánh giá cách đọc kèo bóng đá đệ quy

  1. Đánh giá thuật ngữ không nhận được. VìLiên minh(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 phần còn lại hàng trong kết quả của cách đọc kèo bóng đá đệ quy, và cũng là nơi họ tạm thờiLàm việc bàn.

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

    1. Đánh giá thuật ngữ đệ quy, thay thế nội dung hiện tại của bảng làm việc cho Tự tham khảo lại. VìUnion(nhưng khôngLiên minh tất cả14107_14326Bả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 ý:Nói đúng ra, quá trình này là Lặp lại không đệ quy, nhưngKiểu đệ quyThuật ngữ được chọn bởi Ủy ban Tiêu chuẩn SQL.

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

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

cách đọc kèo bóng đá đệ quy bao gồm_parts (sub_part, part, số lượng) là (
    Chọn Sub_Part, Phần, Số lượng từ các phần trong đó Phần = 'Our_Product'
  Liên minh tất cả
    Chọn P.Sub_Part, P.Part, P.Quantity
    Từ bao gồm_parts pr, các phần p
    Trong đó p.part = pr.sub_part
  )
Chọn sub_part, sum (số lượng) là tổng số_quantity
Từ bao gồm_parts
Nhóm bởi sub_part

Khi làm việc cách đọc kèo bóng đá các truy vấn đệ quy, điều quan trọng là phải chắc chắn rằng phần đệ quy của truy vấn cuối cùng sẽ Trả về không có bộ dữ liệu, nếu không thì truy vấn 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 Các trường để xem nếu cùng một điểm đã đạt được trước đó. Các Phương pháp tiêu chuẩn để xử lý các tình huống như vậy là tính toán Mảng của các giá trị đã được vi thể. Ví dụ, hãy xem xét cách đọc kèo bóng đá sau tìm kiếm một bảngđồ thịSử dụng Alinktrường:

cách đọc kèo bóng đá search_graph (id, liên kết, dữ liệu, độ sâu) là (
        Chọn G.ID, G.Link, G.Data, 1
        Từ đồ thị g
      Liên minh tất cả
        Chọn G.ID, G.Link, G.Data, SG.Depth + 1
        Từ đồ thị G, search_graph SG
        WHERE G.ID = SG.Link
)
Chọn * từ search_graph;

cách đọc kèo bóng đá 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 A"Độ sâu"đầu ra, chỉ thay đổiLiên minh tất cảđếnUnionsẽ không loại bỏ vòng lặp. Thay vì 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 không trong khi đi theo một đường dẫn cụ thể của cách đọc kèo bóng đá liên kết. Chúng tôi thêm hai cộtđường dẫnChu kỳđến cách đọc kèo bóng đá dễ bị lặp lại:

cách đọc kèo bóng đá search_graph (id, liên kết, dữ liệu, độ sâu, đường dẫn, chu kỳ) là (
        Chọn G.ID, G.Link, G.Data, 1,
          Mảng [g.id],
          SAI
        Từ đồ thị g
      Liên minh tất cả
        Chọn G.ID, G.Link, G.Data, SG.DEPTH + 1,
          đường dẫn || g.id,
          g.id = any (đường dẫn)
        Từ đồ thị G, search_graph SG
        Trong đó g.id = sg.link và không chu kỳ
)
Chọn * từ search_graph;

18080_18185"Path"Được thực hiện để đạt được bất kỳ hàng cụ thể nào.

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

cách đọc kèo bóng đá search_graph (id, liên kết, dữ liệu, độ sâu, đường dẫn, chu kỳ) là (
        Chọn G.ID, G.Link, G.Data, 1,
          Mảng [hàng (g.f1, g.f2)],
          SAI
        Từ đồ thị g
      Liên minh tất cả
        Chọn G.ID, G.Link, G.Data, SG.DEPTH + 1,
          đường dẫn || Hàng (G.F1, G.F2),
          Hàng (g.f1, g.f2) = any (đường dẫn)
        Từ đồ thị G, search_graph SG
        Trong đó g.id = sg.link và không chu kỳ
)
Chọn * từ search_graph;

Tip:bỏ quahàng ()Cú pháp trong trường hợp phổ biến chỉ cần một trường đã kiểm tra để 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ột mảng loại tổng hợp, đạt được hiệu quả.

Tip:Thuật toán đánh giá cách đọc kèo bóng đá đệ quy Sản xuất đầ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ị các kết quả theo thứ tự tìm kiếm chiều sâu đầu tiên bằng cách thực hiện cách đọc kèo bóng đá bên ngoàiĐặt hàng bởiA"Path"Cột được xây dựng trong Cách này.

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

cách đọc kèo bóng đá T (n) đệ quy là (
    Chọn 1
  Liên minh tất cả
    Chọn N+1 từ T
)
Chọn n từ T giới hạn 100;

Điều này hoạt động vìPostgreSQLThực hiện chỉ đánh giá như nhiều hàng của acách đọc kèo bóng đáTruy vấn cũng như thực sự được lấy bởi truy vấn cha mẹ. Sử dụng thủ thuật này trong Việc 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. Ngoài ra, nó thường sẽ không hoạt động nếu bạn làm cho bên ngoài truy vấn sắp xếp kết quả của truy vấn đệ quy hoặc tham gia cách đọc kèo bóng đá một số bảng khác, bởi vì trong những trường hợp như vậy, truy vấn bên ngoài thường sẽ Cố gắng lấy tất cả cáccách đọc kèo bóng đácách đọc kèo bóng đá đầu ra dù sao.

Một thuộc tính hữu ích củacách đọc kèo bóng đácách đọc kèo bóng đá là chúng chỉ được đánh giá một lần mỗi lần thực hiện cách đọc kèo bóng đá cha mẹ, ngay cả khi chúng được đề cập nhiều hơn một lần bởi cách đọc kèo bóng đá cha mẹ hoặc anh chị emcách đọc kèo bóng đácách đọc kèo bóng đá. Do đó, những tính toán đắt giá cần thiết trong Có thể đặt nhiều nơi trong mộtcách đọc kèo bóng đáTruy vấn để tránh công việc dự phòng. Khác Ứng dụng có thể là để ngăn chặn bội số không mong muốn Đánh giá các chức năng cách đọc kèo bóng đá tác dụng phụ. Tuy nhiên, cái khác phía của đồng tiền này là trình tối ưu hóa ít có khả năng đẩy Hạn chế từ truy vấn cha mẹ xuốngcách đọc kèo bóng đácách đọc kèo bóng đá hơn một trình tự phụ thông thường. Thecách đọc kèo bóng đácách đọc kèo bóng đá thường sẽ được đánh giá như đã viết, không cần đàn áp các hàng mà cách đọc kèo bóng đá 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 cách đọc kèo bóng đá chỉ Số lượng hàng hạn chế.)

cách đọc kèo bóng đá ví dụ ở trên chỉ hiển thịcách đọc kèo bóng đáđang được sử dụng cách đọc kèo bóng đáChọn, nhưng nó có thể là được đính kèm theo cùng một cách cách đọc kèo bóng đáChèn, Cập nhậthoặcXóa22090_22202

7.8.2. cách đọc kèo bóng đá câu lệnh sửa đổi dữ liệu trongcách đọc kèo bóng đá

Bạn có thể sử dụng cách đọc kèo bóng đá câu lệnh biến đổi dữ liệu (Chèn, Cập nhậthoặcXóa) trong22590_22596. Điều này cho phép bạn thực hiện một số Các hoạt động khác nhau trong cùng một cách đọc kèo bóng đá. Một ví dụ là:

cách đọc kèo bóng đá di chuyển_rows AS (
    Xóa khỏi sản phẩm
    Ở ĐÂU
        "Ngày" = '2010-10-01' và
        "Ngày" <'2010-11-01'
    Trở về *
)
Chèn vào sản phẩm_log
Chọn * từ di chuyển_rows;

cách đọc kèo bóng đá này di chuyển hiệu quả các hàng từSản phẩmđếnSản phẩm_log. TheXóaincách đọc kèo bóng đáXóa cách đọc kèo bóng đá hàng được chỉ định từSản phẩm,, trả lại nội dung của họ bằng phương tiện của nóTrở vềmệnh đề; Và sau đó là cách đọc kèo bóng đá chính đọc rằng đầ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àcách đọc kèo bóng đámệnh đề được gắn vàoChèn, không phải phụ-ChọntrongChèn. Điều này là cần thiết bởi vì sửa đổi dữ liệu cách đọc kèo bóng đá câu lệnh chỉ được phép trongcách đọc kèo bóng đácách đọc kèo bóng đá điều khoản được gắn vào câu lệnh cấp cao nhất. Tuy nhiên, Bình thườngcách đọc kèo bóng đáQuy tắc hiển thị áp dụng, vì vậy Có thể tham khảocách đọc kèo bóng đá23991_24030Chọn.

Câu lệnh sửa đổi dữ liệu trongcách đọc kèo bóng đáthường cóTrở vềmệnh đề, như Nhìn thấy trong ví dụ trên. Nó là đầu ra củaTrở vềmệnh đề,khôngBảng mục tiêu của tuyên bố sửa đổ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 cách đọc kèo bóng đá. Nếu a Câu lệnh sửa đổi dữ liệu trongcách đọc kèo bóng đá24560_24575Trở vềmệnh đề, sau đó nó hình thành không bảng tạm thời và không thể được gọi trong phần còn lại của cách đọc kèo bóng đá. Một tuyên bố như vậy sẽ được thực hiện dù sao. MỘT Ví dụ không đặc biệt là:

cách đọc kèo bóng đá t As (
    Xóa khỏi FOO
)
Xóa khỏi thanh;

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

25163_25347cách đọc kèo bóng đá, ví dụ:

cách đọc kèo bóng đá đệ quy bao gồm_parts (sub_part, part) là (
    Chọn sub_part, một phần từ các phần trong đó phần = 'our_product'
  Liên minh tất cả
    Chọn P.Sub_Part, P.Part
    Từ bao gồm_parts pr, các phần p
    Trong đó p.part = pr.sub_part
  )
Xóa khỏi các bộ phận
  Trong đó phần trong (chọn phần từ bao gồm_parts);

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

Câu lệnh sửa đổi dữ liệu trongcách đọc kèo bóng đáđượ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 cho dù truy vấn chính đọc tất cả (hoặc thực sự bất kỳ) đầu ra của họ. Lưu ý rằng điều này khác cách đọc kèo bóng đá Quy tắc choChọnincách đọc kèo bóng đá26161_26219Chọnchỉ được thực hiện Theo như cách đọc kèo bóng đá chính đòi hỏi đầu ra của nó.

cách đọc kèo bóng đá tiểu thư trongcách đọc kèo bóng đálà thực hiện đồng thời cách đọc kèo bóng đá nhau và cách đọc kèo bóng đá truy vấn chính. Do đó, khi sử dụng các câu lệnh biến đổi dữ liệu trongcách đọc kèo bóng đá, thứ tự trong đó 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 tuyên bố là được thực hiện cách đọc kèo bóng đá cùng mộtSnapshot(xemChương 13), vì vậy họ không thể"Xem"26803_26965Trở về26997_27066cách đọc kèo bóng đáphụ và cách đọc kèo bóng đá chính. MỘT Ví dụ về điều này là trong

cách đọc kèo bóng đá t AS (
    Cập nhật sản phẩm đặt giá = Giá * 1.05
    Trở về *
)
Chọn * từ sản phẩm;

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

cách đọc kèo bóng đá t As (
    Cập nhật sản phẩm đặt giá = Giá * 1.05
    Trở về *
)
Chọn * từ t;

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

Cố gắng cập nhật cùng một hàng hai lần trong một câu nói là không được hỗ trợ. Chỉ 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. Điều này cũng áp dụng để xóa một hàng đã Cập nhật trong cùng một tuyên bố: Chỉ có bản cập nhật được thực hiện. Do đó, bạn thường nên tránh cố gắng sửa đổi một Hàng hai lần trong một tuyên bố duy nhất. Đặc biệt tránh viếtcách đọc kèo bóng đácách đọc kèo bóng đá tiểu thư có thể ảnh hưởng đến cách đọc kèo bóng đá hàng tương tự đã thay đổi theo tuyên bố chính hoặc anh chị em Tệp phụ. Những ảnh hưởng của một tuyên bố như vậy sẽ không phải là có 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 một biến đổi dữ liệu tuyên bố trongcách đọc kèo bóng đákhông được có một 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.