2

私は2つの列を持っています:

   caseSno                 newCaseSno
   7592                     7593
   7591                     7592
   2935                     7591
   7092                     7572

上記の表caseSnoでは、inは元のケース番号で、ケースが他の人に転送された後は新しい番号を保持するCaseSno2 つの列です。このテーブルで関連するすべてのケースを見つけたいと思います。つまり、最初の行では、7593、7592、7591、および 2935 に関連付けられているため、レポートで 7593 を 4 回表示する必要があります。簡単に言えば、Friends of friend メカニズムのようなものが必要です。caseSnonewCaseSnocaseSno

他の列の各列に関連付けられているすべてのレコードを見つける方法を教えてください。

シンプルで高速な実行可能なクエリは高く評価されます。

4

1 に答える 1

0

1 つのアイデアは、3 つのテーブルを定義することです。

CaseTbl         Person             CasePersonHistory
------------    --------------     ------------------
case_id (PK)    person_id (PK)     case_id   (PK)
case_name       etc etc...         person_id (PK)
case_descr                         seq_num   (PK)
etc etc...                         etc etc...

編集:caseテーブル名には使用できません...代わりに何か他のものを選択してください

にはCaseTbl常に 1 つの ID があります。これは一意の説明です。についても同じですPersonCasePersonHistoryケースと人の間の多対多の関係をシーケンス番号で提供します。最も高いのseq_numは現在ケースを所有している人物であり、すべてseq_numの下位は以前にケースを所有していた人です。

たとえば、

fred's person_id  = 54
mikes's person_id = 55
jane's person_id  = 56

case_id1、フレッドが最初にケースを持っていて、それをマイクに渡し、マイクがジェーンに渡した場合、次のCasePersonHistoryようになります...

CasePersonHistory
------------------
case_id      person_id     seq_num
-----------------------------------
1            54            1
1            55            2
1            56            3

これで、case_id に基づいてテーブルから選択し、シーケンス番号の最大値を見つけることで、ケースの現在の所有者が誰であるかを調べることができます。

SELECT MAX(seq_num) FROM CasePersonHistory WHERE case_id = 1;

または、現在ケースを所有している人を取得するには...

SELECT person_id FROM CasePersonHistory WHERE case_id = 1 order by seq_no DESC LIMIT 1

それが役立つことを願っています:)

于 2013-05-28T09:34:36.543 に答える