PL/SQLを使い始めた初心者です。
Oracleのバージョンは9iです。
検索時の条件の設定について教えてください。
例えば、2つテーブルがあるとします。
Aテーブル.TESTNoA
-------------
11111
22222
33333
44444
55555
Bテーブル.TESTNoB
-------------
11111
33333
55555
SQL発行時、
WHERE A.TESTNoA = B.TESTNoB
で3件のレコードが取得できますよね。
これと同じ結果が欲しいのですが、
検索条件にテーブル型の変数(索引付表?)は使用できるのでしょうか?
変数 TestHen(0) = 11111
TestHen(1) = 33333
TestHen(2) = 55555
こんな感じで設定しておいて、この変数を利用して
一度のSQLで結果を取得したいのです。
できればLIKEを使って検索したいのですが…。
書き方がおかしかったらすみません。
どなたかお知恵をお貸しください。
No.2ベストアンサー
- 回答日時:
一度のSQLで取得するのは無理だと思います。
といいますのも
where A.TESTNoA = TestHen(TestHen変数はテーブル型変数)
などと一つのものとテーブル型の変数を=では比較できないからです。
で、どうするかというとテーブル型変数はNo1さんの回答のとおり作成できるのでそこに入っているものをカーソルを用いて中間テーブルに格納し
質問で記述しているwhere句のような形でテーブルとテーブルを結合する形で行を抽出します。
WHERE A.TESTNoA = any ( select b.testNoB from Dummy);
ちなみにLIKEを使って検索したいということですが
抽出したい行のデータとテーブル型変数に入っているデータは完全一致しないデータということでしょうか。
そうであればちょっと上のような例では難しいので
1SQLでは無理ではないでしょうか。
カーソルを使って一つ一つ比較していくしか無いと思います。
この回答への補足
ご回答ありがとうございます。
LIKEを使いたいというのはおっしゃるとおり、完全に一致しないデータがある可能性があるのです。また、抽出結果を別の条件でソートしなければならないため、1回のSQLでなんとかならないかと思ったのですが…。
検討してみます。ありがとうございました。
No.3
- 回答日時:
#2です。
よくプログラマーの方がすごい何十ステップにもおよぶ
1SQL文を書いているのを目にします。
大量データ、性能試験をやって問題なく
動作するのを確認してくれればいいのですが
少量のデータで試験をして正しい回答が出たからこれでOK!
みたいなことをやられると後工程でそのSQLが本番の大量試験になると
1時間経っても返って来ないということがよくあります。
一概には言えませんが
PL/SQLのPL/SQL表やホスト変数としていったん退避して
そのテーブル型変数を用いて単純なSQLをLOOPで繰り返す方が
ずっと早い場合もあります。
(バインド変数などを使うとOracleは実行計画を
再利用してくれたりもするのでさらに高速化します)
プログラムを書く人はできるだけプログラムを単純化、見やすいようにしようと
努力しているようですがその結果処理速度が遅いプログラムになってしまっては
本末転倒です。
あまり「1SQLで!」というのにこだわらず
トータルの処理速度が速い処理内容が一番いいですよ。
この回答への補足
御礼が遅くなり、申し訳ありませんでした。結局、1SQLでは無理かもと仰っていただきましたので、それは諦めました。バインド変数や動的SQLを使ってコーディングしようかと思っています(まだやってないんですけど…)。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- JavaScript html javascriptにてWeb SQLを操作したい。 2 2022/12/16 17:43
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- SQL Server これをSQL文で出来るでしょうか? 1 2023/03/26 02:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
select句副問い合わせ 値の個...
-
MERGE文を単体テーブルに対して...
-
他のテーブルを参照した値はupd...
-
固定値を含む結合と複数テーブ...
-
SET句内で複数の条件を指定して...
-
DELETE 文とEXISTSの使い方につ...
-
unionの結果は集計はできないで...
-
ある条件を持たないレコードの抽出
-
データベースの使い方について...
-
件数を取得する方法
-
外部結合とor条件混在の記述方法
-
unionでマージした副問合せを結合
-
オラクルSQL文のCOUNT関数について
-
複数テーブルのMAX値の行データ...
-
SELECTの結果で同一行を複数回...
-
oracleの分割delete
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
-
Accessで別テーブルの値をフォ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
select句副問い合わせ 値の個...
-
SELECTの結果で同一行を複数回...
-
MERGE文を単体テーブルに対して...
-
select insertで複数テーブルか...
-
複数テーブルのMAX値の行データ...
-
固定値を含む結合と複数テーブ...
-
SQL GROUPで件数の一番多いレコ...
-
unionの結果は集計はできないで...
-
他のテーブルを参照した値はupd...
-
外部結合とor条件混在の記述方法
-
SET句内で複数の条件を指定して...
-
oracleの分割delete
-
DELETE 文とEXISTSの使い方につ...
-
集計後の数値が倍になる
-
unionでマージした副問合せを結合
-
updateの一括実行
-
サブクエリ同士をLEFT JOIN
-
select文でフリーズします。
-
COUNTの取得方法(?)について...
おすすめ情報