2016-12-19 8 views
-3

クエリでrownumを使用することができないので、rowidを使用して2行目から4行目までの結果を得ることができます。rownum以外のrowidここでrownumを使用せずに特定の行を取得する

は、それが2番目と4番目の行を取得します私の現在のクエリです:

SELECT * FROM Record a 
WHERE 
2 = (SELECT COUNT (rowid) 
       FROM Record b 
      WHERE a.rowid >= b.rowid) 

UNION 

SELECT * FROM Record a 
WHERE 
4 = (SELECT COUNT (rowid) 
       FROM Record c 
      WHERE a.rowid >= c.rowid); 

は多分それを行うには、他のより良い方法はありますか? TQ

+5

ROWNUMを使用できないのはなぜですか? –

+3

2番目と4番目に何が注文されましたか? –

+0

あなたの必要性は私には分かりません。サンプルデータと必要な結果を投稿してください。 – Aleksej

答えて

1

あなたはrownumrow_numberを避けたい場合は、sumを使用します:

select * 
from (
     select sum(1) over (order by rowid /* or whatever you need */) as rn, 
       r.* 
      from record 
    ) 
where rn between 2 and 4 

トリックはここだけsum(1)が同じ事を与えるという事実にある、あなたのシナリオでは、このような何かを行うことができますcount(1)またはcount(rowid)またはnot nullの値がcountの場合は、row_numberまたはrownumの行を数えた場合と同じです。 このようにして、sumを使用して、row_numberを明示的に「row_number」または「rownum」と書くことなく計算します。

SQL> create table testTab(x) as (select level from dual connect by level <= 6); 

Table created. 

SQL> select t.*, 
    2   count(1)  over (order by rowid desc) as count, 
    3   sum(1)  over (order by rowid desc) as sum, 
    4   row_number() over (order by rowid desc) as rowNumber 
    5 from testTab t; 

     X  COUNT  SUM ROWNUMBER 
---------- ---------- ---------- ---------- 
     6   1   1   1 
     5   2   2   2 
     4   3   3   3 
     3   4   4   4 
     2   5   5   5 
     1   6   6   6 

外部クエリは単にフィルタを適用します。

+0

OMGこれは動作します!このクエリについて説明できますか – user6308605

5

あなたはrow_number()を使用し、その後、rownumを使用できない場合:

SELECT a.* 
FROM (SELECT a.*, ROW_NUMBER() OVER (ORDER BY rowid) as seqnum 
     FROM Record a 
    ) a 
WHERE seqnum BETWEEN 2 and 4; 

注:??は順序付け列のためです。 SQLテーブルはのように順序付けされていないの集合を表しているため、順序付け列を参照する場合を除いて、第1行または第2行の概念はありません。この目的でrowidを使用できます。オラクル12cに

、あなたはOFFSET/FETCHを使用します。

SELECT a.* 
FROM Record a 
OFFSET 1 ROWS 
FETCH FIRST 3 ROWS ONLY; 

私はあなた使用ROWNUMのことを指摘しなければなりません。あなただけで行うことはできません。

SELECT a.* 
FROM Record a 
WHERE rownum BETWEEN 2 and 4; 

あなたはサブクエリでそれを使用することができます。

SELECT a.* 
FROM (SELECT a.*, rownum as seqnum 
     FROM Record a 
    ) a 
WHERE seqnum BETWEEN 2 and 4; 

ORDER BYせずに、結果を含む、任意の順序で戻ってくるという保証はありませんのでご注意ください。 rowid

+0

、私はrownumの使用を許可されていません。と私はオラクル10g – user6308605

+0

@ user6308605を使用して使用して 'row_number()'を使用 –

+0

正直言って、それは、行番号を使用しないと言います。 'rownum'や' row_number() 'のようなものではありません。何時間も立ち往生した。大変ありがとうございました! @a_horse_with_no_name – user6308605

0

Oracle 12cでは、簡単に行制限を行うことができます。

SELECT * 
FROM RECORD 
OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY 
UNION 
SELECT * 
FROM RECORD 
OFFSET 3 ROWS FETCH NEXT 1 ROWS ONLY 
+0

im using oracle 10g ... – user6308605

関連する問題