Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao một CTE đệ quy trong Transact-SQL lại yêu cầu UNION ALL chứ không phải UNION?

Tôi cho rằng lý do là họ không coi đây là một tính năng ưu tiên đáng để triển khai. Có vẻ như Postgres does hỗ trợ cả hai UNIONUNION ALL .

Nếu bạn có trường hợp mạnh mẽ cho tính năng này, bạn có thể cung cấp phản hồi tại Connect (hoặc bất kỳ URL thay thế của nó sẽ là gì).

Việc ngăn các bản sao được thêm vào có thể hữu ích vì một hàng trùng lặp được thêm vào ở bước sau vào bước trước đó gần như luôn luôn dẫn đến một vòng lặp vô hạn hoặc vượt quá giới hạn đệ quy tối đa.

Có một số chỗ trong Tiêu chuẩn SQL nơi mã được sử dụng thể hiện UNION chẳng hạn như dưới đây

Bài viết này giải thích cách chúng được triển khai trong SQL Server . Họ không làm bất cứ điều gì như thế "dưới mui xe". Bộ đệm ngăn xếp sẽ xóa các hàng khi nó di chuyển để không thể biết liệu hàng sau đó có phải là bản sao của hàng đã xóa hay không. Hỗ trợ UNION sẽ cần một cách tiếp cận hơi khác.

Trong thời gian chờ đợi, bạn có thể dễ dàng đạt được điều tương tự trong TVF nhiều câu lệnh.

Để lấy một ví dụ ngớ ngẩn bên dưới ( Postgres Fiddle )

WITH R
     AS (SELECT 0 AS N
         UNION
         SELECT ( N + 1 )%10
         FROM   R)
SELECT N
FROM   R 

Thay đổi UNION tới UNION ALL và thêm DISTINCT cuối cùng sẽ không cứu bạn khỏi đệ quy vô hạn.

Nhưng bạn có thể triển khai điều này với tư cách là

CREATE FUNCTION dbo.F ()
RETURNS @R TABLE(n INT PRIMARY KEY WITH (IGNORE_DUP_KEY = ON))
AS
  BEGIN
      INSERT INTO @R
      VALUES      (0); --anchor

      WHILE @@ROWCOUNT > 0
        BEGIN
            INSERT INTO @R
            SELECT ( N + 1 )%10
            FROM   @R
        END

      RETURN
  END

GO

SELECT *
FROM   dbo.F () 

Ở trên sử dụng IGNORE_DUP_KEY để loại bỏ các bản sao. Nếu danh sách cột quá rộng để được lập chỉ mục, bạn sẽ cần DISTINCTNOT EXISTS thay vì. Bạn cũng có thể muốn một tham số để đặt số lần đệ quy tối đa và tránh các vòng lặp vô hạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ràng buộc tự tham chiếu trong MS SQL

  2. Chọn các cột không trống bằng SQL Server

  3. Rủi ro xung đột UUID sử dụng các thuật toán khác nhau

  4. Cách di chuyển cơ sở dữ liệu SQL Server sang cơ sở dữ liệu SQL Azure

  5. Hướng dẫn hoàn chỉnh để sửa lỗi cơ sở dữ liệu SQL 5243