假设我有一个名为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)
答案 0 :(得分:1)
这里有一些初学者 - 他们使用递归CTE或游标:
http://blogs.msdn.com/b/sqlazure/archive/2010/07/01/10033575.aspx
答案 1 :(得分: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;