2016-05-07 7 views
0

私は解決できないような難しい問題があります。基準と一致する行より後のすべての行を選択してください

特定の条件に一致する行より後の日付ですべての行を選択する必要があります。テーブル#1にはステータスフラグがあります。 1はエラーを示します。 この場合、ValueDate > 2016-02-02(ID 14の行の後)のすべての行を選択したいが、同じカテゴリに属する​​行のみを選択したい。

カテゴリごとに1つの行にエラーフラグを設定できます。

enter image description here

それは少し複雑になります。私はファイルがある別のテーブル、テーブル#2を持っています。これらのファイルは常に追加されるため、表1の誤ったファイルを置き換えることがあります。

ID 14の代替ファイルがある場合のみ(これは、置換ファイルのCreateDateが誤ったファイルよりも後であることを確認することによってチェックされます)、ID 14の後にあるすべての行を選択します。

誰も私を正しい方向に導くことができますか?テーブル#1のための

列:ID、ファイル、ステータステーブル#2の

列:あなたはwhere句でサブクエリを使用してこれを行うことができ、ID、カテゴリ、CREATEDATE、ValueDate

答えて

2

select t.* 
from t 
where t.date >= (select min(t2.date) 
       from t2 
       where t2.category = t.category and t2.status = 1 
       ); 

あなたがjoinと集合体としてこれを行うことができます。

select t.* 
from t join 
    (select category, min(t2.date) as mindate 
     from t2 
     where t2.status = 1 
    ) t2 
    on t2.category = t.category and t.date > t2.mindate; 
+0

私は 'JOIN'句の助けを借りてこれを行うことができます方法はありますか?理想的には、私は2番目のテーブルに参加したいと思いますし、ID 14の後にすべての行を何らかの方法で "マーク"してフラグを付けたいと思います。 – silkfire

0

2つまたは1つのクエリをリクエストするかどうかはわかりません。私はあなたに2つの質問をし、それがあなたが望む答えでないかどうか教えてくれます。

最初の1:

私はValueDateを持つすべての行を選択したい> 2016年2月2日(ID 14を持つ行 後)が、唯一の同じカテゴリに属する​​それらの行のために。

SELECT * FROM TableALL A 
WHERE A.ValueDate > (SELECT max(B.ValueDate) FROM TableALL B 
        WHERE B.category=A.category 
         AND status=1) 

秒1:

私はID 14後のすべての行を選択したい、唯一のID 14ために利用可能な代替 ファイルを(これは検証することによってチェックされているがあります場合に CREATEDATEのファイルが誤ったファイルより後にある)。

SELECT A.* FROM Table1 A, Table2 B 
WHERE B.CreateDate > (SELECT max(Y.ValueDate) 
         FROM Table1 Z,Table2 Y 
         WHERE Z.id=Y.id 
         AND Y.category = B.category // I thought you 
                // need it here too 
         AND status=1) 
AND A.id=B.id 
関連する問題