2012-03-23 32 views
0

を維持:更新表しかし、私はこれらのテーブルに取り組んでいる一つの既存のデータ

staff(staffID, staffName, branchID, address, phone, lastUpdatedDate) 
branchRef(branchID, branchName) 

SELECT staffID, staffName, staff.branchID, address, phone, lastUpdateDate, branchName 
FROM staff, branchRef 
WHERE staff.branchID=branchRef.branchIC 

によって分類スタッフの詳細に関するレポートを生成するにはたとえば、JohnがBranch01であり、場合どのような2011年とBranch03 2012年。(Branch02、2012)に更新するとき、(Branch01、2011)をどのように保持するか。私は仕事をするためにトリガーを使って、トリガーはほとんどすべてのフィールドに含まれていることを読んだが、私は古いブランチIDの記録を残したい。この問題に対する示唆はありますか?ありがとうございました!

+0

スタッフテーブルにActive_flagという1つの余分な列を追加し、履歴レコードを維持することができます。 – Teja

+0

@Jamie:以前のブランチの履歴を保持したいのですか、または従業員のために実際のブランチの履歴を保持したいですか? –

+0

従業員が新しい支店に移転したときに従業員の前の支店の記録を残したいと思います。だからあなたは彼/彼女の前の枝を追跡することができます。 – Jamie

答えて

0

現在のところ、1対多の関係があります.1人のスタッフには1つの支店がありますが、1つの支店には多くのスタッフがいます。

スタッフが複数のブランチに参加できるようになると(あなたのコメントで述べたように、履歴としても)、関係は多対多の関係になります。別に私はあなたが行うことができますので、どのような順序で他のブランチを取得したい考えることから、以下の通りです:

彼らは同じようにあなたの現在のテーブルを保持しますが、スタッフからbranchIdを取り除く:

staff(staffID, staffName, address, phone, lastUpdatedDate) 
branchRef(branchID, branchName) 

それらの間の関係を保持する新しいテーブルstaff_branchesを作成します。

staff_branches(staffID, branchID) 

テーブルの主キーは、両方のフィールドになります。これらのテーブルの順序を実装する必要があります。順序を気にするだけなら、その順序を保持する整数フィールドを追加するだけです(1、2、など)。あなたは(スタッフがそのブランチに開始した日付など)の追加情報を取得したい場合は、単にorderFieldの日付を使用します。

staff_branches(staffID, branchID, orderField) 

あなたはそれをやった後は、現在のクエリを実行することができますそのstaffIdのmax(orderField)を持つブランチのテーブルを検索して従業員のブランチを作成します。

0

データモデルを更新する必要があるようです。

それは考慮にスタッフがこの問題であなたを助けにはなりませんbranches.c

トリガを切り替えるかもしれないという可能性を取ることはありません。

あなたは可能性:Nの関係:

  • は新しいメートルを表すstart_dateend_datestaffIdbranchIdなどの分野で、新しいテーブルstaff_member_works_in_branchを作ります。レポートを更新する必要があります。 (あなたは多くの場合、これを実行するつもりなら解決策を推奨)
  • 「偽」従業員の行(推奨されません)
とその場しのぎを実装するデータベース
  • の外に移動スタッフデータの記録を保管
  • 関連する問題