2014-09-04 62 views
0

抓取從Oracle數據庫表中的記錄我有表在Oracle,其可具有在下面的數據它需要在特定的順序

W_ID  S_ID   SEQ  Type 
1   Template1  1  W 
1   Template2  2  W 
1   1    3  S 
Template1 2    1  S 
Template1 3    2  S 
Template2 4    1  S 
Template2 5    2  S 
Template2 6    3  S 

現在我想S_ID爲W_Id = 1個順序由SEQ 意味着我想取模板1的第一個結果則Template2

結果後應該如下:

S_ID SEQ 
2  1 
3  2 
4  1 
5  2 
6  3 
1  3 

我已經寫了查詢,如下所示

select W_ID, S_ID, SEQ from Table1 where 

    W_ID in (select S_ID from Table1 where W_ID='1' and Type='W') 
    or 
    (S_ID in (select S_ID from Table1 where W_ID='1' and Type='S') and W_ID='1') 

order by SEQ 

現在的問題是我不能夠獲取引起爲了 請大家幫忙,

Ragards, 約傑什

+0

有人懷疑列在某種程度上是相互關聯的。你能更好地解釋桌子的佈局嗎? – 2014-09-04 11:15:35

+0

是的,在table1中,W_ID可以讓模板分配給它作爲S_ID,在這種情況下它的類型是W. W_ID也可以有直接的S_ID,在這裏它的類型是S.如果類型是W,那麼S_ID必須有擴展。意味着模板可以進一步將S_ID賦值給它,其類型爲S.現在我想要按SEQ順序獲得S_ID。 Template1的SEQ爲1,因此它的記錄將首先獲取,Template2的SEQ爲2,因此它的記錄將在稍後獲取。 – user3705792 2014-09-04 11:23:56

回答

0

你需要它有序首先由模板序列,那麼個人類型'S'seq。這可以通過加入:

select t1.w_id 
    , case t1.type when 'W' then t2.s_id else t1.s_id end s_id 
    , case t1.type when 'W' then t2.seq else t1.seq end seq 
    from table1 t1 
    left outer join table1 t2 
     on t1.type = 'W' 
     and t2.w_id = t1.s_id 
     and t2.type = 'S' 
where t1.w_id = '1' 
order by t1.seq, t2.seq 

要求可以用解析函數來完成額外的功能:

select w_id 
    , s_id 
    , seq 
    from (
    select t1.w_id 
     , case t1.type when 'W' then t2.s_id else t1.s_id end s_id 
     , case t1.type when 'W' then t2.seq else t1.seq end seq 
     , t1.seq t1seq 
     , t2.seq t2seq 
     , row_number() over (
      partition by 
       t1.w_id 
       , case t1.type when 'W' then t2.s_id else t1.s_id end 
      order by 
       t1.seq, t2.seq 
     ) rn 
    from table1 t1 
    left outer join table1 t2 
     on t1.type = 'W' 
     and t2.w_id = t1.s_id 
     and t2.type = 'S' 
    where t1.w_id = '1' 
) 
where rn = 1 
order by t1seq, t2seq 

可能有更簡單的方法 - 這正是我能很快想到的;-)

+0

非常好,它幫助我...謝謝你,非常感謝你.... – user3705792 2014-09-05 08:07:25

+0

多一個查詢,如果我想明確s_id那麼應該在查詢中添加什麼。例如:如果template1具有s_id 6,而template2也具有映射在其中的s_id 6。但template1的seq是1,template2是2,所以我只需要6從template1。如何實現這一目標?請幫助 – user3705792 2014-09-05 10:35:35

+0

真棒男人...真棒!太好了。我對你印象深刻。萬分感謝。 – user3705792 2014-09-08 07:56:18

0

看來,你只需要一個自聯接,從而獲得所需結果:

with table1(W_ID,S_ID,SEQ,Type) as (
    select '1', 'Template1', 1, 'W' from dual union all 
    select '1', 'Template2', 2, 'W' from dual union all 
    select '1', '1', 3, 'S' from dual union all 
    select 'Template1', '2', 1, 'S' from dual union all 
    select 'Template1', '3', 2, 'S' from dual union all 
    select 'Template2', '4', 1, 'S' from dual union all 
    select 'Template2', '5', 2, 'S' from dual union all 
    select 'Template2', '6', 3, 'S' from dual) 
---------- 
-- End if Data 
---------- 
select a.S_ID a_s_id, b.s_id b_s_id, b.seq 
    from table1 a 
    join table1 b on a.s_id = b.w_id 
where a.w_id = '1' 
    and (a.type='W' or a.w_id = b.s_id) 
    and b.type='S' 
order by a.seq, b.s_id; 

輸出:

| A_S_ID | B_S_ID | SEQ | 
|-----------|--------|-----| 
| Template1 |  2 | 1 | 
| Template1 |  3 | 2 | 
| Template2 |  4 | 1 | 
| Template2 |  5 | 2 | 
| Template2 |  6 | 3 | 
|   1 |  1 | 3 | 

更新:

改變序列還後,它工作正常(從評論部分: - >「改變S_ID的序列= 1〜2,使模板2的順序爲3,那麼結果應該是模板1的記錄然後再模板2的記錄以這種方式)S_ID 1的記錄

with table1(W_ID,S_ID,SEQ,Type) as (
     select '1', 'Template1', 1, 'W' from dual union all 
     select '1', 'Template2', 3, 'W' from dual union all 
     select '1', '1', 2, 'S' from dual union all 
     select 'Template1', '2', 1, 'S' from dual union all 
     select 'Template1', '3', 2, 'S' from dual union all 
     select 'Template2', '4', 1, 'S' from dual union all 
     select 'Template2', '5', 2, 'S' from dual union all 
     select 'Template2', '6', 3, 'S' from dual) 
---------- 
-- End if Data 
---------- 
select a.S_ID a_s_id, b.s_id b_s_id, b.seq 
    from table1 a 
    join table1 b on a.s_id = b.w_id 
where a.w_id = '1' 
    and (a.type='W' or a.w_id = b.s_id) 
    and b.type='S' 
order by a.seq, b.s_id; 

輸出:

| A_S_ID | B_S_ID | SEQ | 
|-----------|--------|-----| 
| Template1 |  2 | 1 | 
| Template1 |  3 | 2 | 
|   1 |  1 | 2 | 
| Template2 |  4 | 1 | 
| Template2 |  5 | 2 | 
| Template2 |  6 | 3 | 
+0

非常感謝San,非常感謝您....這部分解決了我的問題。它適用於Template1和Template2及其所有後續記錄。但使用此我無法獲得直接記錄分配給W_ID,即在我們的S_ID = 1的情況記錄中。請幫助 – user3705792 2014-09-05 04:25:41

+0

嗨..是不是從查詢獲取的最後一條記錄是您正在尋找?查詢中使用的「或」條件符合目的。如果沒有,然後讓我知道。 – San 2014-09-05 05:10:03

+0

嗨,我無法獲取S_ID = 1的最後一條記錄。你可以看看嗎? – user3705792 2014-09-05 05:23:38