1

假设我有一个名为 EMPLOYEE 的表,该表有一个名为 ManagerID 的字段。此字段是 EMPLOYEE 表的另一条记录的 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)
4

2 回答 2

1

这里有一些启动器——它们要么使用递归 CTE,要么使用游标:

http://blogs.msdn.com/b/sqlazure/archive/2010/07/01/10033575.aspx

http://social.msdn.microsoft.com/Forums/en-ZA/transactsql/thread/50a0bd26-87c8-4197-84f9-5fb1dfd792b6

于 2011-05-24T20:00:26.830 回答
1

如果您正在处理 SQL 服务器,这里是符合您要求的解决方案;你需要写 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;
于 2018-06-18T12:05:58.577 回答