2010-12-07 17 views
0

私は複雑なクエリを作成しています。私はJOINでそれをやろうと考えていますが、どこから始めたらいいのか分かりません。できるだけ明確に私の問題を説明しようとします。SQLiteで複雑なクエリ

私は補償を扱うソフトウェアを作成しています。すべての補償は、チェーン内のような複数のリンクを持つことができます。基本的に各リンクは顧客です。

カスタマー

CustomerID | Name 

報酬

CompensationID | CustomerID | Date 

はリンク

LinkID | CompensationID | CustomerID | Sequential 

は今、すべてのリンクを持つシーケンシャルフィールド増加が追加さ:だから、私はちょうどあなたのテーブル構造を教えてあげます。私はいくつかのデータを持つテーブルを充填することによって実証してみましょう:

CustomerID | Name 
-----------+----- 
0   | Foo 
1   | Bar 
2   | Baz 

CompensationID | CustomerID | Date 
---------------+------------+------ 
0    | 0   | 2-2-2010 
1    | 1   | 2-3-2010 


    LinkID | CompensationID | CustomerID | Sequential 
    -------+----------------+------------+----------- 
    0    0    0   0 
    1    0    2   1 
    2    0    1   2 

だから、何があっLINKID/CompensationID /得意シーケンシャルは常に(補償がありどのように多くのリンクによって異なります)リンクテーブルに0からNに行きます。今ここに

は問題です:私はすべての報酬のそのリンクの満たし、次の要件をリストしたい:リンク 得意先、この場合に シーケンシャル= 0(最初のリンクを)=とLASTシーケンシャル=(中

検索2) リストの補償はここ

は、私がこれまでに得たものである:

SELECT * FROM Compensation JOIN Link ON Compensation.ID = Link.CompensationID 
WHERE Link.CustomerID=A AND Link.Sequential = 0 AND Link.Sequential=LAST 

私はLink.Sequentialが0にカントを知っているので、これは多かれ少なかれ擬似SQLで、同時に別の価値がありますが、私はこれをどうやって行うのか分かりません。

ご協力いただければ幸いです。

ありがとうございます。

P.S. 大きな壁には申し訳ありません。

+0

をお試しくださいLASTです - リンクテーブルに複数の行がある場合は決してありません)。 –

+0

一人の顧客のすべての最初のリンクとすべての最後のリンクが必要ですか? – OrangeDog

+0

リンクの最初と最後の行にCustomerIDがAかどうかを確認する必要があります。だから、私は2行だけをチェックする必要があります。 – vanneto

答えて

1

文は私が覚えてどのように動作するところでサブクエリ場合:

​​
0

は `Link.Sequential = 0 OR Link.Sequential = LAST`で試してみてください(AND時に0のみ評価します

SELECT c.* 
FROM Compensation c 
JOIN (select CompensationID, MAX(Sequential) AS LastSeq FROM Link GROUP BY CompensationID) AS LastOnes ON c.ID = LastOnes.CompensationID 
JOIN (select CompensationID FROM Link WHERE CustomerID=A AND Sequential=0) AS FirststOnes ON c.ID = FirststOnes.CompensationID 
JOIN Link AS l on l.CompensationID=c.CompensationID AND l.CustomerID=A AND l.Sequential=LastOnes.LastSeq