PostgreSQL: kèo chấp bóng đá hôm nay liệu: | |||
---|---|---|---|
prev | UP | Chương 7. kèo bóng đá pháp | NEXT |
kèo bóng đá phápCung 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 đá pháp 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 đá pháp. Mỗi câu lệnh phụ trợ trong mộtkèo bóng đá phápmệnh đề có thể là mộtChọn, Chèn, Cập nhậthoặcXóa; vàkèo bóng đá phápmệ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.
Giá trị cơ bản củaChọninkèo bóng đá pháplà chia nhỏ các kèo bóng đá pháp phức tạp thành các phần đơn giản hơn. Một ví dụ là:
kèo bóng đá pháp 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 đá pháp khu vực bán hàng hàng đầu. Thekèo bóng đá phápmệnh đề xác định hai câu lệnh phụ trợ có tênkhu vực_salesvàTop_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 đá pháp. Ví dụ này có thể đã được viết mà không cókèo bóng đá pháp, 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 đá phápTừ một sự thuận tiện của cú kèo bóng đá 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ụngđệ quy, Akèo bóng đá phápkèo bóng đá pháp 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 đá pháp này để tổng hợp các số nguyên từ 1 đến 100:
kèo bóng đá pháp đệ quy t (n) là (
Hình thức chung của một đệ quykèo bóng đá phápkèo bóng đá pháp 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 đá pháp. Một kèo bóng đá pháp như vậy được thực thi như sau:
Đánh giá kèo bóng đá pháp đệ quy
Đá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 đá pháp đệ quy và cũng đặt chúng vào tạm thờiBảng làm việc.
Miễn là bảng làm việc không trống, hãy lặp lại kèo bóng đá pháp bước sau:
Đánh giá thuật ngữ đệ quy, thay thế kèo bóng đá pháp nội dung hiện tại của bảng làm việc để 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 đá pháp đệ quy và cũng đặt chúng vào tạm thờiBảng trung gian.
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, mà làKiểu đệ quyLà thuật ngữ được lựa 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 duy nhất trong mỗi bước và nó có kèo bóng đá pháp giá trị từ 1 đến 100 trong kèo bóng đá pháp 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 đá pháp chấm dứt.
kèo bóng đá pháp đệ 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 đá pháp 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 đá pháp đệ 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 đá pháp đệ quy, điều quan trọng là phải chắc chắn rằng phần đệ quy của kèo bóng đá pháp cuối cùng sẽ không trả lời được, nếu không thì kèo bóng đá pháp 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ỏ kèo bóng đá pháp hàng trùng lặp kèo bóng đá pháp 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 đá pháp 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 đá pháp search_graph (id, liên kết, dữ liệu, độ sâu) là (
kèo bóng đá pháp này sẽ lặp lại nếulinkMối quan hệ chứa kèo bóng đá pháp 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.| Hàng (G.F1, G.F2),vàChu kỳđến kèo bóng đá pháp dễ bị lặp lại:
kèo bóng đá pháp search_graph đệ quy (id, liên kết, dữ liệu, độ sâu, | g.id,, chu kỳ) là (
Ngoài kèo bóng đá pháp 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"Path"Đượ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 đá pháp trườngF1vàf2:
kèo bóng đá pháp 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ú kèo bóng đá 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 đá pháp đệ 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 đá pháp 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 đá pháp 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 đá pháp cha mẹ. Ví dụ, kèo bóng đá pháp này sẽ lặp lại mãi mãi mà không cầngiới hạn:
kèo bóng đá pháp đệ quy t (n) là (
Điều này hoạt động vìPostgreSQLS Triển khai chỉ đánh giá bằng nhiều hàng của Akèo bóng đá phápkèo bóng đá pháp như thực sự được tìm kiếm bởi kèo bóng đá pháp 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 đá phápđầu ra của kèo bóng đá pháp.
Một thuộc tính hữu ích củakèo bóng đá phápkèo bóng đá pháp là chúng chỉ được đánh giá một lần mỗi lần thực hiện kèo bóng đá pháp cha mẹ, ngay cả khi chúng được nhắc đến nhiều lần bởi kèo bóng đá pháp cha mẹ hoặc anh chị emkèo bóng đá phápkèo bóng đá pháp. 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 đá phápkèo bóng đá pháp để 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 với tác dụng phụ.kèo bóng đá phápkèo bóng đá pháp hơn một trình tự phụ thông thường. Thekèo bóng đá phápkèo bóng đá pháp 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 đá pháp 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 đá pháp chỉ có một số lượng hạn chế.
kèo bóng đá pháp ví dụ ở trên chỉ hiển thịkèo bóng đá phápđang được sử dụng kèo bóng đá phápChọn, nhưng nó có thể được đính kèm theo cùng một cách kèo bóng đá phápChèn, Cập nhậthoặcXóa. Trong mỗi trường hợp, nó cung cấp (kèo bóng đá pháp) bảng tạm thời có thể được đề cập trong lệnh chính.
Bạn có thể sử dụng kèo bóng đá pháp câu lệnh biến đổi dữ liệu (Chèn, Cập nhậthoặcXóa) trongkèo bóng đá pháp. Đ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 đá pháp.
kèo bóng đá pháp di chuyển_rows AS (
kèo bóng đá pháp này di chuyển hiệu quả các hàng từSản phẩmđếnProducts_log. TheXóainkèo bóng đá phápXóa kèo bóng đá pháp 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 đá pháp 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 đá phápmệ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ì kèo bóng đá pháp câu lệnh biến đổi dữ liệu chỉ được phép trongkèo bóng đá phápkèo bóng đá pháp đ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 đá phápQuy tắc hiển thị áp dụng, vì vậy có thể tham khảokèo bóng đá phápĐầ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 đá phápthườ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 đá pháp. Nếu câu lệnh biến đổi dữ liệu trongkèo bóng đá phápthiế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 đá pháp. Một tuyên bố như vậy sẽ được thực hiện dù sao.
kèo bóng đá pháp t As (
Ví dụ này sẽ xóa tất cả kèo bóng đá pháp hàng khỏi bảngfoovàBar. Số lượng kèo bóng đá pháp 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 đá pháp hàng bị xóa khỏiBar.
Không được phép tự giới thiệu trong kèo bóng đá pháp 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 đá pháp, ví dụ:
kèo bóng đá pháp đệ quy bao gồm_parts (sub_part, part) là (
kèo bóng đá pháp này sẽ xóa tất cả các phần con 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 đá phápđượ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 đá pháp 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 đá pháp: Như đã nêu trong phần trước, thực hiện A24494_24502chỉ được thực hiện theo như kèo bóng đá pháp chính yêu cầu đầu ra của nó.
kèo bóng đá pháp tiểu thư trongkèo bóng đá phápđược thực hiện đồng thời với nhau và với kèo bóng đá pháp chính. Do đó, khi sử dụng các câu lệnh biến đổi dữ liệu trongkèo bóng đá pháp, 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 đá pháp cùng mộtSnapshot(xemChương 13), vì vậy họ không thể"Xem"Hiệu ứng của nhau trên kèo bóng đá pháp bảng đích. Điều này làm giảm bớt kèo bóng đá pháp tác động của sự khó lường của thứ tự thực tế của kèo bóng đá pháp 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 đá phápền đạt các thay đổi giữa các khác nhaukèo bóng đá phápphụ và kèo bóng đá pháp chính. Một ví dụ về điều này là trong
kèo bóng đá pháp 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 đá pháp 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 đá pháp26322_26486
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 đá phápKhô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.