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.kèo bóng đá eurokèo bóng đá euro (biểu thức bảng chung)

kèo bóng đá euroCung 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 đá euro 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 đá euro. Mỗi câu lệnh phụ trợ trong mộtkèo bóng đá euromệnh đề có thể là mộtChọn, Chèn, Cập nhậthoặcXóa; vàkèo bóng đá euromệnh đề được gắn vào một câu lệnh chính có thể là mộtChọn, Chèn, Cập nhật, XóahoặcHợp nhất.

7.8.1.Chọnin11440_11446

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

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

Tùy chọnKiểu đệ quythay đổi công cụ sửa đổikèo bóng đá euroTừ 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 đá eurokèo bóng đá euro 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 đá euro này để tổng hợp các số nguyên từ 1 đến 100:

kèo bóng đá euro đệ 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 đệ quykèo bóng đá eurokèo bóng đá euro luôn làThuật ngữ không nhận được, sau đóUnion(hoặcLiên minh tất cả), sau đó AThuật ngữ đệ quy14001_14122

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

    1. Đánh giá thuật ngữ đệ quy, thay thế kèo bóng đá euro 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 đá euro đệ 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 khiđệ quy15624_15721

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 đá euro giá trị từ 1 đến 100 trong kèo bóng đá euro bước liên tiếp. Trong bước thứ 100, không có đầu ra vì15960_15967mệnh đề, và do đó kèo bóng đá euro chấm dứt.

kèo bóng đá euro đệ 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 đá euro 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:

16288_16650

7.8.2.2. Phát hiện chu kỳ

22067_22262Unionthay 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 đó. 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ột mảng các giá trị đã được truy cập. Ví dụ: hãy xem xét lại kèo bóng đá euro sau tìm kiếm một bảngđồ thịSử dụng Alinktrường:

kèo bóng đá euro search_graph đệ quy (id, liên kết, dữ liệu, độ sâu) là (
    Chọn G.ID, G.Link, G.Data, 0
    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;

kèo bóng đá euro này sẽ lặp lại nếulinkMối quan hệ chứa kèo bóng đá euro chu kỳ. Bởi vì chúng tôi yêu cầuMạnhDEPTHđầ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 đường dẫn liên kết cụ thể hay không. Chúng tôi thêm hai cộtIS_CYCLEđường dẫnđến kèo bóng đá euro dễ bị lặp lại:

kèo bóng đá euro search_graph đệ quy (id, liên kết, dữ liệu, độ sâu,IS_CYCLE, đường dẫn) như (
    Chọn G.ID, G.Link, G.Data, 0,Sai,
      Mảng [g.id]Từ đồ thị g
  Liên minh tất cả
    Chọn G.ID, G.Link, G.Data, SG.DEPTH + 1,g.id = any (đường dẫn),
      đường dẫn || G.IDTừ đồ thị G, search_graph SG
    WHERE G.ID = sg.linkvà không is_cycle)
Chọn * từ search_graph;

Ngoài kèo bóng đá euro 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.

24552_24708F1f2:

kèo bóng đá euro search_graph đệ quy (id, liên kết, dữ liệu, độ sâu,IS_CYCLE, đường dẫn) như (
    Chọn G.ID, G.Link, G.Data, 0,Sai,
      Mảng [hàng (g.f1, g.f2)]Từ đồ thị g
  Liên minh tất cả
    Chọn G.ID, G.Link, G.Data, SG.DEPTH + 1,hàng (g.f1, g.f2) = any (đường dẫn),
      đường dẫn || Hàng (g.f1, g.f2)Từ đồ thị G, search_graph SG
    WHERE G.ID = sg.linkvà không is_cycle)
Chọn * từ search_graph;

TIP

Bỏ quaRow ()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ỳ. kèo bóng đá euro trên cũng có thể được viết như thế này:

kèo bóng đá euro search_graph đệ quy (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
)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 đá euro 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 đá euro cột chu kỳ và đường dẫn sẽ hoàn toàn được thêm vào kèo bóng đá euro hàng đầu ra của CTE.

TIP

Cột đường dẫn 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. kèo bóng đá euro có thể có cả ATìm kiếmvà AChu kỳ26901_27063Chu kỳmệnh đề và thứ tự theo cột đường dẫn. 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 kèo bóng đá euro 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 đá euro cha mẹ. Ví dụ, kèo bóng đá euro này sẽ lặp lại mãi mãi mà không cầngiới hạn:

kèo bóng đá euro đệ quy t (n) là (
    Chọn 1
  Liên minh tất cả
    Chọn N+1 từ T
)
Chọn n từ tGiớ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 Akèo bóng đá eurokèo bóng đá euro như thực sự được tìm kiếm bởi kèo bóng đá euro 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. Ngoài ra, nó thường không hoạt động nếu bạn thực hiện kèo bóng đá euro bên ngoài sắp xếp kết quả của kèo bóng đá euro đệ quy hoặc tham gia với chúng với một số bảng khác, bởi vì trong những trường hợp như vậy, kèo bóng đá euro bên ngoài thường sẽ cố gắng tìm kiếm tất cả cáckèo bóng đá eurođầu ra của kèo bóng đá euro.

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ủakèo bóng đá eurokèo bóng đá euro là chúng thường được đánh giá chỉ một lần mỗi lần thực hiện kèo bóng đá euro cha mẹ, ngay cả khi chúng được nhắc đến nhiều lần bởi kèo bóng đá euro cha mẹ hoặc anh chị emkèo bóng đá eurokèo bóng đá euro. 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 đá eurokèo bóng đá euro để 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ụ. Tuy nhiên, mặt khác của đồng tiền này là trình tối ưu hóa không thể đẩy các hạn chế từ kèo bóng đá euro cha mẹ xuống một tham chiếu nhân29240_29246kèo bóng đá euro, vì điều đó có thể ảnh hưởng đến tất cả việc sử dụngkèo bóng đá eurođầu ra của kèo bóng đá euro khi nó chỉ ảnh hưởng đến một. Tham khảo nhânkèo bóng đá eurokèo bóng đá euro 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 đá euro 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 đá euro chỉ có một số lượng hạn chế.)

Tuy nhiên, nếu Akèo bóng đá eurokèo bóng đá euro không được nhận và không có tác dụng phụ (nghĩa là, nó làChọ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 đá euro cha mẹ, cho phép tối ưu hóa khớp của hai mức kèo bóng đá euro. Theo mặc định, điều này xảy ra nếu kèo bóng đá euro cha mẹ tham chiếukèo bóng đá eurokèo bóng đá euro chỉ một lần, nhưng không phải nếu nó tham khảokèo bóng đá eurokèo bóng đá euro 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 đá eurokèo bóng đá euro 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 đá euro cha mẹ. Lựa chọn sau có nguy cơ tính toán trùng lặp củakèo bóng đá eurokèo bóng đá euro, 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 đá eurokèo bóng đá euro chỉ cần một phần nhỏ củakèo bóng đá eurođầu ra đầy đủ của kèo bóng đá euro.

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

kèo bóng đá euro W AS (
    Chọn * từ Big_Table
)
Chọn * từ w where key = 123;

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

kèo bóng đá euro W AS (
    Chọn * từ Big_Table
)
Chọn * Từ W như W1 Tham gia W AS W2 trên W1.Key = W2.Ref
Trong đó w2.key = 123;

Thekèo bóng đá eurokèo bóng đá euro 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 nối 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 đá euro 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 đá euro W không được vật chất hóa (
    Chọn * từ Big_Table
)
Chọn * Từ W như W1 Tham gia W AS W2 trên W1.Key = W2.Ref
Trong đó w2.key = 123;

31886_31964BIG_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 đá euro W AS (
    Chọn phím, rất
)
Chọn * Từ W như W1 Tham gia W AS W2 trên W1.F = W2.F;

Ở đây, vật chất hóakèo bóng đá eurokèo bóng đá euro đả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 đá euro ví dụ trên chỉ hiển thịkèo bóng đá eurođang được sử dụng kèo bóng đá euroChọn, nhưng nó có thể được đính kèm theo cùng một cách kèo bóng đá euroChèn, Cập nhật, Xóahoặchợp nhất32787_32891

7.8.4. kèo bóng đá euro câu lệnh sửa đổi dữ liệu trongkèo bóng đá euro

Bạn có thể sử dụng hầu hết kèo bóng đá euro câu lệnh biến đổi dữ liệu (Chèn, Cập nhậthoặcXóa, nhưng khôngMerge) trongkèo bóng đá euro. Đ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 đá euro. Một ví dụ là:

kèo bóng đá euro 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;

kèo bóng đá euro này di chuyển hiệu quả các hàng từSản phẩmđếnSản phẩm_log. TheXóainkèo bóng đá euroXóa kèo bóng đá euro 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 đá euro 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 đá euromệnh đề được gắn vàoChèn, không phải phụ-34405_34413trongChèn. Điều này là cần thiết vì kèo bóng đá euro câu lệnh biến đổi dữ liệu chỉ được phép trongkèo bóng đá eurokèo bóng đá euro đ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 đá euroQuy tắc hiển thị áp dụng, vì vậy có thể tham khảokèo bóng đá euroĐầ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 đá eurothườ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 kèo bóng đá euro. Nếu câu lệnh biến đổi dữ liệu trongkèo bóng đá euroThiế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 đá euro. 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à:

kèo bóng đá euro T AS (
    Xóa khỏi FOO
)
Xóa khỏi thanh;

Ví dụ này sẽ xóa tất cả kèo bóng đá euro hàng khỏi bảngfooBar. Số lượng kèo bóng đá euro 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 đá euro hàng bị xóa khỏiBar.

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

Với đệ quy bao gồm_parts (sub_part, part) là (
    Chọn sub_part, một phần từ kèo bóng đá euro 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, kèo bóng đá euro phần p
    Trong đó p.part = pr.sub_part
)
Xóa khỏi kèo bóng đá euro bộ phận
  Trong đó phần trong (chọn phần từ bao gồm_parts);

kèo bóng đá euro 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 đá eurođượ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 đá euro 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 đá euro: 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 đá euro chính yêu cầu đầu ra của nó.

kèo bóng đá euro tiểu thư trongkèo bóng đá eurođược thực hiện đồng thời với nhau và với kèo bóng đá euro chính. Do đó, khi sử dụng các câu lệnh biến đổi dữ liệu trongkèo bóng đá euro, thứ tự kèo bóng đá euro 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 đá euro 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 đá euro bảng đích. Điều này làm giảm bớt kèo bóng đá euro tác động của sự khó lường của thứ tự thực tế của kèo bóng đá euro 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 đá euroền đạt các thay đổi giữa các khác nhaukèo bóng đá eurotiểu thư và kèo bóng đá euro chính. Một ví dụ về điều này là trong

38093_38195

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 đá euro 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ề 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. Điều này cũng áp dụng để xóa một hàng đã được cập nhật trong cùng một câu lệnh: 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 câu. Đặc biệt tránh viếtkèo bóng đá euro39057_39221

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 đá euroKhô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.

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ớp Kinh nghiệm của bạn kèo bóng đá euro tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu này40809_40873