2016-07-18 5 views
1

私は、テーブル内のペアの左右の部分のリストを検索するプロジェクトを行っています。表には、一意の部品IDの列と、左または右の属性の列が含まれています。Oracle SQLは、別の列の条件に基づいて順次値を検索します。

テーブルに右の左のペアがある場合、左のIDは右の前に1つの一意のパートIDが表示されます(ID 4は左になり、ID 5は右になります)。しかし、左右のペアの間には、ペアがないユニークなIDが多数あります。私は、テーブル内のすべての左と右のペアを見つけるためにクエリを記述しようとしています。例えば

(現在はIDとLRの両方がVARCHAR2です)

ID LR 
1 L 
2 R 
5 R 
9 R 
22 R 
34 L 
35 R 
38 L 
91 L 
92 R 

と私は思考の

ID LR 
1 L 
2 R 
34 L 
35 R 
91 L 
92 R 

私の現在の行は、すべてのIDを選択するための条件付きクエリで返すようにクエリを必要とし、 LRがRのときID - 1が存在し、LRがLだがわからない...どんな助けでも大歓迎!ありがとうございました。

答えて

0

設定操作は、これを行う方法の1つです。

(コメントごとに問合せをリライトするために編集した - それは今varchar型のIDフィールドに先行ゼロを扱う)


WITH matches AS (
    SELECT to_number(ID) AS ID_integer 
    FROM base_table 
    WHERE LR = 'L' 
    INTERSECT 
    SELECT to_number(ID)-1 
    FROM base_table 
    WHERE LR = 'R' 
) 
SELECT bt.ID, bt.LR, m.ID_integer 
FROM base_table bt, matches m 
WHERE LR = 'L' 
AND to_number(bt.ID) = m.ID_integer 
UNION 
SELECT bt.ID, bt.LR, m.ID_integer 
FROM base_table bt, matches m 
WHERE LR = 'R' 
AND to_number(bt.ID)-1 = m.ID_integer 
ORDER BY 3, 2; 
+0

これは動作しません - あなたはID年代が連続シーケンスではないことがわかりました? 2の後の次のIDは3ではなく5です。 – mathguy

+0

@mathguy、私はそれをテストしました。 –

+0

id 2を2(lr = R)の代わりに3に変更し、他のすべてを同じにして、クエリがまだ動作するかどうかを確認します。 – mathguy

0
with inputs (id, lr) as (
     select 1, 'L' from dual union all 
     select 2, 'R' from dual union all 
     select 5, 'R' from dual union all 
     select 9, 'R' from dual union all 
     select 22, 'R' from dual union all 
     select 34, 'L' from dual union all 
     select 35, 'R' from dual union all 
     select 38, 'L' from dual union all 
     select 91, 'L' from dual union all 
     select 92, 'R' from dual 
    ), 
    prep (id, lr, prev_lr, next_lr) as (
     select id, lr, lag(lr) over (order by id), lead(lr) over (order by id) 
     from inputs 
    ) 
select id, lr 
from  prep 
where (lr = 'L' and next_lr = 'R') or (lr = 'R' and prev_lr = 'L') 
order by id 
; 


     ID L 
---------- - 
     1 L 
     2 R 
     34 L 
     35 R 
     91 L 
     92 R 
関連する問題