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

Vòng lặp vô hạn trong CTE khi phân tích cú pháp bảng tự tham chiếu

Lý do của vòng lặp vô hạn là bản ghi đầu tiên trong đó empid=mgrid . Để xử lý vấn đề này, bạn nên bao gồm một trường tích lũy (levels trong ví dụ này) để lưu trữ mgrid bạn đã xử lý và kiểm tra xem emid đã có trong danh sách này để tránh lặp lại.

Đây là một truy vấn:

with Tree as
        (
        SELECT  empid
        ,       mgrid
        ,       1 as lv
        ,       1 as level1
        ,       null as level2
        ,       null as level3
        ,       null as level4
        ,       null as level5
        ,       cast(mgrid as varchar(max)) levels  
        FROM    Employees
        WHERE   empid = 1 and mgrid = 1
        UNION ALL
        SELECT  E.empid
        ,       E.mgrid
        ,       T.lv + 1
        ,       T.level1
        ,       case when T.lv = 1 then E.empid else t.level2 end
        ,       case when T.lv = 2 then E.empid else t.level3 end
        ,       case when T.lv = 3 then E.empid else t.level4 end
        ,       case when T.lv = 4 then E.empid else t.level5 end
        ,       T.levels+','+cast(E.mgrid as varchar(max)) levels   

          FROM    Employees AS E
        JOIN    Tree T
        ON      E.mgrid = T.empid 
                and (','+T.levels+',' 
                      not like 
                     '%,'+cast(E.empid as varchar(max))+',%')
        )
select  *
from Tree
order by empid

Và đây là SQLFiddle demo




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thêm hoặc thả cột bằng cách sử dụng GUI trong SQL Server - Hướng dẫn sử dụng SQL Server / T-SQL Phần 39

  2. Không thể tìm thấy đối tượng vì nó không tồn tại hoặc bạn không có quyền. Lỗi trong máy chủ SQL

  3. xóa hàng khóa chính là khóa ngoại của bảng khác

  4. Cách sao lưu cơ sở dữ liệu Sql theo phương pháp lập trình trong C #

  5. FLOOR () Ví dụ trong SQL Server