3

この構造のテーブルがあります:

ここに画像の説明を入力

このスクリプトを使用して、リクエストをクエリします。

SELECT   D.DELIVERY_REQUEST_ID AS "REQUEST_ID",
         'Delivery' AS "REQUEST_TYPE"
   FROM  DELIVERY_REQUEST D
UNION
SELECT   I.INVOICE_REQUEST_ID AS "REQUEST_ID",
         'Invoice' AS "REQUEST_TYPE"
   FROM  INVOICE_TRX I

結果は次のようになります。

    REQUEST_ID    |    REQUEST_TYPE
__________________|____________________
                  |
    1             |    Delivery
    1             |    Invoice
    2             |    Delivery
    2             |    Invoice

私がやりたいことは、次のように最初に一意のキー(INTであり、自動番号のようにする必要があります)を使用してこれをクエリ(またはビューを作成)することです:

ID  |  REQUEST_ID    |    REQUEST_TYPE
____|________________|____________________
    |                |
1   |  1             |    Delivery
2   |  1             |    Invoice
3   |  2             |    Delivery
4   |  2             |    Invoice

前もって感謝します。

4

4 に答える 4

6

まず、文字列を追加するときに UNION ALL を使用して、Oracle が個別の並べ替えを試行しないようにします。

実際に質問に答えるには、分析関数ROW_NUMBER()を使用できます

select row_number() over ( order by request_id, request_type ) as id
     , a.*
  from ( select d.delivery_request_id as request_id
              , 'delivery' as request_type
           from delivery_request d
          union all
         select i.invoice_request_id as request_id
              , 'invoice' as request_type
           from invoice_trx i
                ) a
于 2013-06-26T09:28:59.890 に答える
1

rownum を使用できます:

select rownum, REQUEST_ID, REQUEST_TYPE
from
(
SELECT   D.DELIVERY_REQUEST_ID AS "REQUEST_ID",
         'Delivery' AS "REQUEST_TYPE"
   FROM  DELIVERY_REQUEST D
UNION
SELECT   I.INVOICE_REQUEST_ID AS "REQUEST_ID",
         'Invoice' AS "REQUEST_TYPE"
   FROM  INVOICE_TRX I
)
于 2013-06-26T09:36:43.823 に答える
1

IDを生成する代わりに、連結REQUEST_TYPE + REQUEST_IDして列に入れようとしないのはなぜですか?ID

ID  |  REQUEST_ID    |    REQUEST_TYPE
____|________________|____________________
    |                |
D1  |  1             |    Delivery
I1  |  1             |    Invoice
D2  |  2             |    Delivery
I2  |  2             |    Invoice
于 2013-06-26T09:30:18.953 に答える
-1

シーケンスが最も簡単な方法だと思います。ID を常に 1 から開始する場合は、クエリの前にシーケンスを再開します。

ALTER SEQUENCE temp_id RESTART 1;

これがどれほど速いかわからない場合は、より高速な方法があるかどうかを調べてください。特定の SQL システムには、標準 SQL の拡張として、このための特別な機能がある場合もあります。

于 2013-06-26T09:46:21.823 に答える