2012-01-01 20 views
3

を返します。Oracleのテーブルから最大のIDを選択する私は、クエリを持って、null値に

SELECT MAX(prod_id) FROM products; 

レコードがある場合には最大値を返します。しかし、テーブルを切り捨てて同じクエリを実行すると、maxというIDを取得できません。

+0

テーブル内のすべてのデータを削除するとテーブル – user367134

+1

を切り捨てると最大IDを得る方法はあります。**テーブルからデータを取得する方法は絶対にありません**。そう、いいえ。以下の両方の回答を参照してください。私は 'truncate'文書へのリンクを私の答えに入れていますので、あなたのテーブルに' truncate'が何をするのかについてより多くの情報が必要な場合は、それを読むことができます。 – Ben

答えて

0

テーブルを切り捨てると、テーブルに行が残っていません。定義上、Max()は空のテーブルに対して実行するとNULLを返します....またはここで何かを逃しましたか?

+1

私は考えていました...オラクルでは、prod_idがシーケンスで定義されている場合、 SELECT prod_id.currval FROM DUAL は、使用された最後の番号を取得します。定義された。 –

4

はい、truncatingテーブルでは、すべてのデータを削除しました。commitは不要です。したがって、テーブルにはデータがなく、何もないのはmaxです。あなたは、テーブルの列を照会し、MAX関数はnullを返すことが疑われる場合、あなたはケースのヌルに0を返すことができますしたい場合には

16

SELECT NVL(MAX(P.PROD_ID), 0) AS MAX_VAL 
FROM PRODUCTS P 

に遭遇されていない値なら、これは、少なくとも0を返します。

+0

これは私のために働く、ありがとう –

0

Gerald P. Wrightが答えにコメントしたように、IDがシーケンスによって生成された場合、その値を見つけるために使用することができます。 CURRVALは唯一あなたがCURRVALと値をフェッチセッションで動作するため、 しかし

SELECT prod_id_seq.currval FROM DUAL 

は、動作しません。

ので、

SELECT prod_id_seq.nextval FROM DUAL 

はあなたのための回避策ことができますが、(あなたはこれを数回IDを取得する場合は、インクリメント値を取得します)本当に、本当にBAD解決策になります。

+0

また場合は、シーケンスのキャッシュに依存します。 – Ben

関連する問題