2017-05-14 48 views
1

をコミット1の後に複数のテーブルの状態を探す:SQLiteの:私は、次の3つのテーブルを持っている

FirstNames  
Name NameID CommitID 
Sam  1  1 
Dave 2  1 
James 3  1 
Andrew 2  2 

SecondNames  
Name  NameID CommitID 
Stevens 1  1 
Jones 2  1 
Michaels 3  1 
Anns  2  2 
K  1  2 

NameID 
NameID 
1 
2 
3 

名前IDテーブルから名前IDフィールドは、新しい名前がに保存された最初の時間に生成される一意のフィールドですデータベース。名前は2番目と1番目の名前(別々のテーブルに格納されています)で構成されています。ここでNameIDは最初の名前を2番目の名前にリンクします。

CommitIDは、名前の特定の更新に関連付けられたIDです。更新はfirstname、secondname、またはfirstnameとsecondnameの両方に同時に行うことができます。同時に倍数の名前を更新する場合、CommitIDはこの更新グループで同じになります。

私の目的は、 "編集された"名前の状態が特定のコミットであったことを教えてくれる4番目のテーブルを作成するためのクエリを書くことです。例として、ここから2つのコミットがあることがわかります(コミットID 1 & 2)。これは、次の表を返します

私にコミット2で編集した第1または第2のいずれかの名前を持っていたすべての名前の最初と2番目の名前を取得します:

EditedNameID FirstName SecondName CommitID 
1    Sam   K   2 
2    Andrew  Anns  2 

重要な私のクエリは次のように言うだろう(そして私が失敗している点)は、「Sam K」がコミット1からファーストネームを、コミット2から彼のセカンドネームを取ることです。

私はこれを全日朝に苦労し、正しい答えには達していません誰にもこれに対する解決策があるのだろうか?私の説明が不明であるかどうか、あるいはおそらく要件が私にスキーマを調整する必要があるかどうかを教えてください。

答えて

1

CommitIDの大きい行は見たくありません。だから、最大のものを検索する前にどこにそれらを除外するだけですCommitID

SELECT NameID AS EditedNameID, 
     (SELECT Name 
     FROM FirstNames 
     WHERE NameID = NameID.NameID 
      AND CommitID <= ? 
     ORDER BY CommitID DESC 
     LIMIT 1 
     ) AS FirstName, 
     (SELECT Name 
     FROM LastNames 
     WHERE NameID = NameID.NameID 
      AND CommitID <= ? 
     ORDER BY CommitID DESC 
     LIMIT 1 
     ) AS LastName, 
     ? AS CommitID 
FROM NameID 
WHERE NameID IN (SELECT NameID FROM FirstNames WHERE CommitID = ?) 
    OR NameID IN (SELECT NameID FROM LastNames WHERE CommitID = ?); 
+0

ありがとう - それは私のためにそれを解決します – SSS

関連する問題