2017-05-11 16 views
1

私は開始行を記録するログテーブルと特定のイベントの終了行を持っています。SQL - テーブル内の各エントリ - 関連付けられた行を確認します

各イベントには開始行があり、すべてが正常になると終了行が必要です。

何か問題が生じた場合、最終行が作成されないことがあります。

私はSELECTにテーブルに開始行がありますが、関連する終了行は含まれていないすべてを入れたいと思います。例えば

、このようなテーブルを考える:id列5は、開始行が、無端の行を有すること

id event_id event_status 
1  123   1 
2  123   2 
3  234   1 
4  234   2 
5  456   1 
6  678   1 
7  678   2 

が気づきます。開始はevent_status 1、終了はevent_status 2です。

開始行は終了行ではないすべてのevent_idsを取り戻すにはどうすればよいですか?

これはmssql用です。

答えて

4

あなたが他の行は、それがイベントを終了存在しないことを要求するnot existsサブクエリを使用することができます。

select * 
from YourTable t1 
where status = 1 
     and not exists 
     (
     select * 
     from YourTable t2 
     where t2.event_id = t1.event_id 
       and t2.status = 2 
     ) 
0

あなたは左自己で試すことができますが、以下のように参加する:この特定のケースで

select y1.event_id from #yourevents y1 left join #yourevents y2 
    on y1.event_id = y2.event_id 
    and y1.event_status = 1 
    and y2.event_status = 2 
    where y2.event_id is null 
     and y1.event_status = 1 
0

解決策1:3つの解決策のうちの1つを使用することができます。古典
チェックは終わりの状態が存在しない場合

SELECT * 
FROM myTable t1 
WHERE NOT EXISTS (
    SELECT * 
    FROM myTable t2 
    WHERE t1.event_id = t2.event_id AND t2.status=2 
) 

ソリューション2.それはかなりしてください。各イベントの場合
もっと柔軟性を最後のステータスのためのソリューション3.ルックを非常に多くの括弧
同じチェックでサブクエリを行いますが、より簡潔できれいな方法で

SELECT t1.* 
FROM myTable t1 
LEFT JOIN myTable t2 ON t1.event_id = t2.event_id AND t2.status=2 
-- Doesn't exist 
WHERE t2.event_id IS NULL 

しないでくださいステータスロジックがより複雑になる

WITH last_status AS (
SELECT 
    id, 
    event_id, 
    status, 
    -- The ROWS BETWEEN ..yadda yadda ... FOLLOWING might be unnecessary. Try, check. 
    last_value(status) OVER (PARTITION BY event_id ORDER BY status ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_status 
FROM myTable 
) 
SELECT 
    id, 
    event_id, 
    status 
FROM last_events 
WHERE last_status<>2 

他にも、最小/最大クエリなどがあります。清潔、可読性、多様性のニーズに最適なものを選んでください。

関連する問題