2011-08-04 13 views
0

テーブルを使用して作業しているSQLデータベース、従業員が報告する担当者のユーザー名を含むreport_toという列を持つ従業員があります。私たちがしたいことは、この表現を数値表現に変更することです。例えば:SQL内の階層


'a'は 'b'へのレポートを 'c'に報告します。したがって、 'a' = 49、 'b' = 50、 'c' = 51のような表現になります。 'd'が 'c'の上司になったら、 'd' = 52になります。インターン「E」と「F」、次に「E」と「F」の両方が示されているように48


に等しいのスーパーバイザは、ゼロ以外の数で番号を開始するだけでなく、上方なく拡張を可能にしますまた、階層的なチェーンの下に。

主な質問は、現在の構造(report_to)から数値表現に変換するにはどうすればよいですか?

注:これは私の意見ではMSSQL

+0

どのバージョンのSQL Serverですか? 2008+には、ヒエラシッドデータタイプがあります。 – Oded

+0

2008 R2は、そのデータ型をsharepointにエクスポートできますか? – Vap0r

+0

エクスポート可能とはどういう意味ですか? – Oded

答えて

1

あなたは0

あるべき新しい列(ランク)を追加することができますそして、最初のステップは、BIG BOSSを見つけることです - これは、上司を持っていないユーザーでなければなりません - report_toはnullです。彼のランクは1になります。

2番目のステップは、彼の最初の指示を見つけることです。彼らは2とランクされます:

UPDATE TABLE SET RANK = 2 
WHERE report_to IN 
(SELECT username FROM TABLE WHERE RANK = 1) 

第3のステップは、ダイレクトの指示を見つけることです。次のステップは、RANK = 0が見つからなくなるまで、ステップ2および3と同じです。

これらのすべての手順は、WHILEステートメント内のプロシージャで実行できます。最後に

、あなたは1に代わり50から順位を開始したい場合は、あなたが更新することができます:

UPDATE TABLE SET RANK = 50 - RANK 

またはあなたが何かをお見逃しなく確認するために:

UPDATE TABLE SET RANK = (SELECT MAX(RANK) FROM TABLE) + 1 - RANK 
+0

あまりにも多くのクエリが実行されている、私はこれを行う簡単な方法があると思います。 – Grigor

+0

これは、人がシステムで追加/削除/昇格/降格されるたびに再実行する必要があります。 –

+0

@Grigor:ループ内で実行する必要があるのは1つだけです。 – CristiC

-2

で、あなたが無制限のポジションを持つことができないので、そのつもりはどこかに停止し、ちょうど位置を使用し、数値のカウンタを使用する必要はありません。各ユーザー名には、インターン、スーパーバイザー、雇用主、プロジェクトマネージャーなどのポジションが必要です。あなたが変更するときには、上司のそれは雇用者、またはそれに類するものになります。あなたはその考えを得る。 :)

+0

問題は、この組織では、1つの子ノード上に11の親ノードが存在する可能性があり、数値形式で表現されていない場合は、論理チェックよりも小さいものを使用するのではなく、多数のif/elseステートメントで何かをしてください。問題は、if/elseチェックでは非常に制限されています。これは、infopathとのデータ接続として使用するためにMSの共有ポイントに持ち込まれているためです。 これは、これを達成する方法を知っていますか?または少なくとも問題を解決するには? – Vap0r

0

うわー...あなたはユーザーテーブルを持っていますか?そうでなければ、提案1はそれを作成することです。

users_table 
------------ 
username 
user_id 
name_first 
name_last 
other_stuff_? 

次に、固有の名前を記述しているテーブルをクエリすることによって、既存のすべてのユーザー名を入力します。このステップでは、user_idは順序付けされたid値として設定されます。

あなたは

user_user 
----------- 
user_id_1 
user_id_2 
relationship 
begin_dt 
end_dt 

、あなたはユーザ関係とするとき、それは有効であったに各ユーザにこの新しいテーブルを読み込むことができ、新しいテーブルを追加することができます。例えばユーザー48は、いつか関係= '管理'で始まるユーザー50と関係していました

この関係はおそらく別のテーブルとは異なるはずですが、私はエクササイズとしてあなたに任せます。

1

テーブル内の従業員のスーパーバイザを含むフィールドがある場合、階層的なCTEを使用して階層を取得できます。 Books ONlineでそれを調べ、質問がある場合は私達に連絡してください。

+0

再帰的なCTEはセクシーです。これはおそらく最もクリーンなソリューションです。 –