- PR -

oracleSQLについて

投稿者投稿内容
蒼月
会議室デビュー日: 2008/11/28
投稿数: 5
投稿日時: 2008-11-28 23:24
私は今、オラクルのデータベースのデータ移行を行っています。
その移行の過程で2つほど調べてもわからない部分が出てきたので、教えてください。

@新規登録時にシーケンスを使わずに、必ずそのフィールドの最大値+1の値をInsertしたいがどうすれば良いか?

A主キーが3つのフィールドからなるテーブルがあり、そのテーブルを外部キーにもつテーブルが2つある状態で、外部キーに持っているテーブル2つを外部結合する方法。

@は、MAX()+1みたいなことができないか試してみましたが駄目でした。
Aについては、主キーが1つであれば結合は簡単だったのですが、複数となるとどのようにすれば良いかがわかりませんでした。

以上、お手数おかけしますが、ご教授お願い致します。
まさる
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 59
お住まい・勤務地: 越後の中ほど
投稿日時: 2008-11-29 00:12
@
どのようなことを試されてだめだったのでしょうか?

コード:
SELECT
 MAX(ID) AS MAX_ID
FROM
 HOGE



みたいにして最大値をとって、+1した結果をINSERT文のパラメータに使えばできると思いますが。

それとも、1回のSQL発行で行うとしてうまくいかないということでしょうか。

A
イメージがわかないのですが、

・TABLE_A
KEY1
KEY2
KEY3
VALUE

・TABLE_B
ID
KEY1
KEY2
KEY3

・TABLE_C
ID
KEY1
KEY2
KEY3

というようなテーブルがあったとして、TABLE_AにTABLE_B,Cを外部結合する、ということでしょうか。

だとしたら、

コード:
SELECT
 A.VALUE
,B.ID AS ID_B
,C.ID AS ID_C
FROM
 TABLE_A A
,TABLE_B B
,TABLE_C C
WHERE
    A.KEY1 = B.KEY1(+)
AND A.KEY2 = B.KEY2(+)
AND A.KEY3 = B.KEY3(+)
AND A.KEY1 = C.KEY1(+)
AND A.KEY2 = C.KEY2(+)
AND A.KEY3 = C.KEY3(+)



でできると思います。
_________________
まさるblog
蒼月
会議室デビュー日: 2008/11/28
投稿数: 5
投稿日時: 2008-11-30 01:44
まさるさん

レスありがとうございます。
返信遅くなって申し訳ありません。

@1回のSQLの発行で+1したいのです。
INSERT INTO HOGE(ID)
VALUES((MAX(SELECT ID FROM HOGE) +1))

という感じでできないかと思ったのですが、できませんでした。
ほかの方法についても、探してはみたのですが、まだみつかっていない状態です。


Aまさるさんの仰るとおりです。
教えていただいた方法で、うまく結合することができました。
ありがとうございます。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2008-11-30 02:38
こんばんは

select insert でできないですかね?

たぶんこんな感じ

SELECT MAX(ID)+1 FROM HOGE
INSERT INTO HOGE;
まさる
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 59
お住まい・勤務地: 越後の中ほど
投稿日時: 2008-11-30 06:45
引用:

蒼月さんの書き込み (2008-11-30 01:44) より:
@1回のSQLの発行で+1したいのです。
INSERT INTO HOGE(ID)
VALUES((MAX(SELECT ID FROM HOGE) +1))



INSERT文の構文で、

コード:
INSERT INTO テーブル名 VALUES 対象項目列挙,... SELECT 〜



というものがあります。

このSELECT以降に、末記人さんが書いたような感じで指定してやればうまくいくと思います。
_________________
まさるblog
蒼月
会議室デビュー日: 2008/11/28
投稿数: 5
投稿日時: 2008-11-30 21:30
>末記人さん
レスありがとうございます。
アドバイスを参考に、SQLを組み立ててみます。

>まさるさん
ありがとうございます。
構文についても調べて、実施してみます。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2008-12-01 09:28
コード:
SELECT MAX(ID)+1 FROM HOGE 
INSERT INTO HOGE; 



コード:
INSERT INTO HOGE
SELECT MAX(ID)+1 FROM HOGE 


の間違いでした。INTO TEMPと勘違いしてました。

[hitorigoto]
でも、SELECT INSERTって呼びますよね?
[/hitorigoto]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-12-01 09:58
引用:

末記人さんの書き込み (2008-12-01 09:28) より:

コード:
INSERT INTO HOGE
SELECT MAX(ID)+1 FROM HOGE 





1件目を(ID=1 で)登録する場合も考慮すると、こうしたほうがいいかも。
COALESCE が使えない場合は NVL で。

コード:
INSERT INTO HOGE
SELECT COALESCE(MAX(ID)+1, 1) FROM HOGE;

スキルアップ/キャリアアップ(JOB@IT)