0

私が今日直面している問題を説明しようとしています。実際、NLP エンジンのデポ内でユーザーが適用した変更を追跡するために、テーブルを設計しました。

Token And Lexeme という名前の 2 つのテーブルがあります。各トークンには、語彙素テーブルの行に直接接続する ID があります。トークン テーブルを参照することで、常に最新の語彙素を見つけることができます。

ここに彼らのスキームがあります:

Token Table:
+-----+----------+----------+
| Id  | token    |LexemeId* |
+-----+----------+----------+
LexemeId refers to a row inside of lexeme table.

語彙素表:

+-----+---------------------+-------------+
| Id  | some information    |UpdatedFrom* |  
+-----+---------------------+-------------+
* UpdatedFrom field refers another row inside of Lexeme Table. 

Null は、このトークン (語彙素) に関連する行がこれ以上ないことを意味します。

例:

Token Table:
+-----+----------+----------+
| 0   | A        |4         |
| 1   | B        |1         |
+-----+----------+----------+


Lexeme Table:

+-----+----------------------+-------------+
| 0   | A information#1      |NULL         |  
| 1   | B information        |NULL         |  
| 2   | A information#2      |0            |  
| 3   | A information#3      |2            |
| 4   | A information#4      |3            |    
+-----+----------------------+-------------+

空気をきれいにすることができれば幸いです。各トークンに関連するすべてのレコードを収集するストア プロシージャを記述したいと考えています。たとえば、トークン「A」の場合、配列 (またはデータ テーブル) は次のようになると予想されます。

+-----+----------------------+-------------+
| id  | informations         | updated from|
+-----+----------------------+-------------+
| 0   | A information#1      |NULL         |  
| 2   | A information#2      |0            |  
| 3   | A information#3      |2            |
| 4   | A information#4      |3            |    
+-----+----------------------+-------------+

誰かが私を助ける考えを持っています....

SQL トランスクリプトに関する私の知識は、Update、Insert、および Select ステートメントに要約されています。

高度なありがとう...

4

1 に答える 1

2

これが再帰的 CTE をサポートする RDBMS にあると仮定して、次を試してください。

with cte as 
(select t.id TokenId, t.token, l.Id, l.SomeInformation, l.UpdatedFrom
 from Token t
 join Lexeme l on t.LexemeId = l.id
 union all
 select t.TokenId, t.token, l.Id, l.SomeInformation, l.UpdatedFrom
 from cte t
 join Lexeme l on t.UpdatedFrom = l.id)
select Id, SomeInformation, UpdatedFrom
from cte
where TokenId=0 /* token = 'A' */

ここでSQLFiddle 。

于 2013-05-12T14:07:55.610 に答える