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 に答える