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 đá việt namkèo bóng đá việt nam (biểu thức bảng chung)

kèo bóng đá việt namCung 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 đá việt nam 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 đá việt nam. Mỗi câu lệnh phụ trợ trong mộtkèo bóng đá việt nammệnh đề có thể là mộtChọn, Chèn, Cập nhậthoặcXóa; vàkèo bóng đá việt nammệ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 đá việt nam

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

10782_11257

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 đá việt nammệ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 đá việt nam. Ví dụ này có thể đã được viết mà không cókèo bóng đá việt nam, 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ọnđệ quyThay đổi công cụ sửa đổikèo bóng đá việt nam12033_12156đệ quy, Akèo bóng đá việt namkèo bóng đá việt nam 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 đá việt nam này để tổng hợp các số nguyên từ 1 đến 100:

kèo bóng đá việt nam đệ 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 đá việt namkèo bóng đá việt nam luôn làThuật ngữ không nhận được, sau đóUnion(hoặcUnion all), 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 kèo bóng đá việt nam. Một kèo bóng đá việt nam như vậy được thực thi như sau:

Đánh giá kèo bóng đá việt nam đệ 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 hàng còn lại trong kết quả của kèo bóng đá việt nam đệ 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 đá việt nam đệ 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.

Lưu ý:Nói đúng ra, quá trình này là lặp lại không đệ quy, mà làKiểu đệ quy14152_14212

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 đá việt nam chấm dứt.

14510_14742

kèo bóng đá việt nam đệ 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 kèo bóng đá việt nam 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ẽ không trả lời không, 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ả15398_15831đồ thịSử dụng Alinktrường:

kèo bóng đá việt nam 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;

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

kèo bóng đá việt nam 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;

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 cho"đường dẫn"Đượ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 đá việt nam 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 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 đá việt nam đệ 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 đá việt nam bên ngoàiĐặt hàng bởiA"Path"cộ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 đá việt nam 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 đá việt nam cha mẹ. Ví dụ, kèo bóng đá việt nam này sẽ lặp lại mãi mãi mà không cầngiới hạn:

kèo bóng đá việt nam 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ìPostgreSQL19148_19201kèo bóng đá việt namTruy vấn như thực sự được tìm kiếm bởi truy vấn 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 truy vấn bên ngoài sắp xếp kết quả của truy vấn đệ quy hoặc tham gia kèo bóng đá việt nam chúng kèo bóng đá việt nam 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 tìm kiếm tất cả cáckèo bóng đá việt namđầu ra của kèo bóng đá việt nam.

Một thuộc tính hữu ích củakèo bóng đá việt namkèo bóng đá việt nam là chúng chỉ được đánh giá một lần mỗi lần thực hiện kèo bóng đá việt nam cha mẹ, ngay cả khi chúng được giới thiệu nhiều lần bởi kèo bóng đá việt nam cha mẹ hoặc anh chị emkèo bóng đá việt namkèo bóng đá việt nam. 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 đá việt namTruy vấn để tránh công việc dư thừa. 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 kèo bóng đá việt nam 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 ít có khả năng đẩy các hạn chế từ truy vấn cha xuống xuốngkèo bóng đá việt namkèo bóng đá việt nam hơn một kèo bóng đá việt nam con thông thường. Thekèo bóng đá việt namkèo bóng đá việt nam thường 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 đá việt nam 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 đá việt nam chỉ có một số lượng hạn chế.)

Các ví dụ ở trên chỉ hiển thịkèo bóng đá việt namđang được sử dụng kèo bóng đá việt namChọn, nhưng nó có thể được đính kèm theo cùng một cách kèo bóng đá việt namChè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 đá việt nam

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 đá việt nam21328_21421

kèo bóng đá việt nam 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 đá việt nam 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 đá việt namXó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 đá việt nam chính đọc đầu ra đó và chèn nó vàoProducts_log.

Một điểm tốt của ví dụ trên làkèo bóng đá việt nammệnh đề được gắn vàoChèn22248_22264Chọ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 đá việt namCá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 đá việt namQuy tắc hiển thị áp dụng, vì vậy có thể tham khảokèo bóng đá việt namĐầ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 đá việt namthường cóTrở vềmệnh đề (xemPhầ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 đá việt nam. Nếu câu lệnh biến đổi dữ liệu trongkèo bóng đá việt namthiế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 đá việt nam. 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 đá việt nam T AS (
    Xóa khỏi FOO
)
Xóa khỏi thanh;

Ví dụ này sẽ xóa tất cả các hàng khỏi bảngfooBar23632_23724Bar.

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 đá việt nam, ví dụ:

kèo bóng đá việt nam đệ 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);

kèo bóng đá việt nam 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 trong24445_24451đượ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 kèo bóng đá việt nam việc truy vấn 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 kèo bóng đá việt nam quy tắc choChọninkèo bóng đá việt nam: 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 đá việt nam chính yêu cầu đầu ra của nó.

Các tiểu thư trongkèo bóng đá việt namđược thực hiện đồng thời kèo bóng đá việt nam nhau và kèo bóng đá việt nam truy vấn chính. Do đó, khi sử dụng các câu lệnh biến đổi dữ liệu trongkèo bóng đá việt nam, 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 đá việt nam cùng mộtSnapshot(xemChương 13), vì vậy họ không thể"Xem"Hiệ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 đá việt namền đạt các thay đổi giữa các khác nhaukèo bóng đá việt namphụ và kèo bóng đá việt nam chính. Một ví dụ về điều này là trong

kèo bóng đá việt nam 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ả lại giá ban đầu trước khi hành động củaCập nhật, trong khi ở

kèo bóng đá việt nam 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.

26141_26579kèo bóng đá việt namCác tiểu đơn 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 đá việt namkhô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.