初心者ですが教えて下さい。
表Aと表Bで表Aに含まれていないものを表Cに入れたいのですが、下記のやり方では表Aのものしか入れることができません。
どこが悪いのか教えて下さい。
・コードは複雑なため、簡略化しています。UNIONは使わない方向で。
CREATE OR REPLACE PROCEDURE SAMPLE
IS
CURSOR SELLINE1 IS SELECT * FROM A ORDER BY KEY1,KEY2;
CURSOR SELLINE2 IS SELECT * FROM B ORDER BY KEY1,KEY2;
CNT1 NUMBER;
CNT2 NUMBER;
BEGIN
SELECT COUNT(*) INTO CNT1 FROM C;
IF CNT1 = 0 THEN
FOR SELREC IN SELLINE1 LOOP
INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT;
END LOOP;
FOR SELREC IN SELLINE2 LOOP
SELECT COUNT(*) INTO CNT2 FROM C WHERE (KEY1 = SELREC.KEY1) AND (KEY2 = SELREC.KEY2);
IF CHK_CNT2 = 0 THEN
INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT;
END IF;
END LOOP;
END IF;
END;
/
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
処理が途中ではいるのでPROCEDUREにしていると判断して回答します。
(そうでない場合はNo.1の方の回答で)
1.B表のCURSORをOPEN
2.B表上のA表との重複を比較したい項目でA表を検索
(CURSORを作りCOUNTをとるのが望ましいです
直書きでもいいですが・・・)
3.存在しない場合(COUNTが0の場合)INSERT
存在した場合は処理をしない
この流れではないでしょうか?
ちなみに、MINUSでSELECTを作りINSERTするのも手です。
(項目が同じでない場合手間が増えますが・・・)
ご回答ありがとうございました。
下記の通り、格納データに問題があったようです・・・すみませんでした。
同じ処理をするにしてもいろいろなやり方があるので、持ってる知識でどこまでやれるか悪戦苦闘中です。
No.1
- 回答日時:
RDBの理論は数学の「集合」です。
ご所望の動作はとてもシンプルに記述できます。
insert into c select i from b where not exists(select * from a where a.i=b.i)
UNIONは使わないとか条件が付いているところをみると
本当の初心者ではないですよね?(実は職業プログラマ?)
集合演算は教養として身につけるとよいですよ。
ご回答ありがとうございました。
調べてみた結果、表に格納されているデータの方に問題があったみたいです。
他の言語、DBはやった事があるのですが、ORACLEはまったく初めてで・・・結果的に単純な事ですみませんでした。
集合演算の知識もなかったので、これから勉強したいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php エラー 2 2022/10/23 16:43
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- 大学受験 英作文の添削をお願いしたいです。 2 2022/08/19 20:37
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- Visual Basic(VBA) エクセル VBA 難しいです 1 2023/02/21 15:39
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
処理件数を非表示にしたい
-
データ型でFloatとreal の計算...
-
ストアドプロシージャ_カーソル...
-
Accessで処理経過を表示したい...
-
カーソル0件の時にエラーを発生...
-
SELECT と INSERT の速度
-
カーソル宣言をIFで分けられま...
-
PL/SQL で continue ?
-
NVLとDECODEのスピード差
-
RDBとVSAMの比較
-
SQL-LOADERの逆のもの
-
SQL plus で改行
-
カーソルを使って、最終行レコ...
-
インサート処理のスピード
-
差し込み後、元データを変更し...
-
外部参照してるキーを主キーに...
-
フィルターかけた後、重複を除...
-
エクセルで最後の文字だけ置き...
-
SQLで特定の項目の重複のみを排...
-
for whichの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カーソル0件の時にエラーを発生...
-
データ型でFloatとreal の計算...
-
処理件数を非表示にしたい
-
カーソルを使って、最終行レコ...
-
カーソル宣言をIFで分けられま...
-
NVLとDECODEのスピード差
-
ACCESSで一括処理する方法
-
ストアドプロシージャ_カーソル...
-
Accessで処理経過を表示したい...
-
SELECT と INSERT の速度
-
カーソルオープンの処理について
-
クエリの実行時間の目安
-
動的SQLの処理件数
-
RDBとVSAMの比較
-
(x 行処理されました)を表示さ...
-
oracle pl/sqlの処理速度について
-
【PL/SQL】カンマ区切りのレコ...
-
PL/SQL で continue ?
-
SQL plus で改行
-
複数レコードを1変数にセット...
おすすめ情報