Tsql 检查递归外键的方法

Tsql 检查递归外键的方法,tsql,foreign-keys,cross-join,Tsql,Foreign Keys,Cross Join,假设我有一个名为EMPLOYEE的表,该表有一个名为ManagerID的字段。此字段是其经理所在员工表的另一条记录的FK。验证没有循环引用(递归外键)的理想方法是什么 编辑-让我补充一点,每个员工都不需要经理。将有一些员工记录未设置ManagerID字段。 *示例:用户123将用户345作为其经理。用户345将用户567作为其管理器。出于某种疯狂的原因,用户567将用户123作为他们的管理者 我想检查用户345是否在循环引用中* 最好的办法是什么?一个简单的查询?业务逻辑代码(C#/VB.NET

假设我有一个名为EMPLOYEE的表,该表有一个名为ManagerID的字段。此字段是其经理所在员工表的另一条记录的FK。验证没有循环引用(递归外键)的理想方法是什么

编辑-让我补充一点,每个员工都不需要经理。将有一些员工记录未设置ManagerID字段。

*示例:用户123将用户345作为其经理。用户345将用户567作为其管理器。出于某种疯狂的原因,用户567将用户123作为他们的管理者

我想检查用户345是否在循环引用中*

最好的办法是什么?一个简单的查询?业务逻辑代码(C#/VB.NET)

其他人做了什么

示例表架构-

-- Employee Table --
UserID (int - PK)
ManagerID (int - FK to another UserID; can be null)

以下是一些初学者-他们使用递归CTE或游标:


如果您使用的是SQL server,以下是符合您需求的解决方案; 您需要编写CTE来查找循环引用

下面的查询将为您提供具有循环引用的用户ID

WITH TRACKER AS
(


SELECT U.id,U.manager_id,CAST(','+cast(U.id as varchar(36))+',' as varchar(max)) as Path,0 as Cycle FROM User_table AS U
    UNION ALL
    SELECT U.id,U.manager_id, TRACKER.Path + CAST(U.id AS varchar(36))+',', case WHEN TRACKER.Path LIKE '%,'+CAST(U.id AS VARCHAR(36)) + ',%' then 1 else 0 end   FROM User_table AS U

 INNER JOIN TRACKER ON U.manager_id = TRACKER.id WHERE TRACKER.Cycle=0 
)

SELECT TRACKER.id from TRACKER where Cycle= 1;

请问你们有一些桌子结构吗?