「Oracle」タグアーカイブ

ORA-01799: 列は副問合せに対して外部結合されません。


今日もエラーが出ました。

ORA-01799: 列は副問合せに対して外部結合されません。

下のように解決しました。 (使っているデータベースは Oracle 10g11g のどっちかでした。)

事例 1

エラーが出たのは次の結合条件。

LEFT JOIN で結合するテーブルの結合条件に副問合せをつかうと駄目みたいです。

期待する結果

上のコードでやりたいのは、 JNYUKA.BUNNO がメインテーブルの値(MAIN.BUNNO)以下になっているもので、最大のものをとることです。下のように。

MAIN BUNNO JNYUKA BUNNO FNY BUNNO
1 1 1
2 2 2
3 2

上のコードではエラーがでます。 カーソルを使っていったんテーブルに入れるのも面倒です。そこで・・・

このようにすればエラーはでません。 BUNNOがメインテーブル以下のものをすべて結合した後で、最大のもののみに絞り込むイメージ。

事例 2

別の例があったので・・・

Oracleで子テーブルの最新を外部結合できない!? で次のコードを見つけました。

この場合だと

とすればいいことになります。

ON ではなくて JOIN の中に条件を入れてしまう方法でも解決できます。


複数のSQLを一度に実行するためのスクリプト


Oracle では、PL/SQL や CREATE 文 をファイルにしておいて、ファイルにしたスクリプトを実行することができる。

(Windows では) plsql を開き、下のように@マークの後にファイル名を続けて書いて Enter を押せば OK だ。

@"C:\Folder\xxx.sql" 続きを読む 複数のSQLを一度に実行するためのスクリプト


VBA: Access のテーブル定義を一覧で出す方法


Microsoft Office Access(アクセス)のファイル(.mdb)の中のテーブル定義一覧を、 Oracle用のテーブル定義に変換して、一覧で出力するコードを紹介します。

概要

  • Excel と VBA を使用します。
  • VBA の 関数 GetTableDefinitions を実行すると、 開いているエクセルのシートにアクセスファイル内のテーブル定義を一覧出力します。
  • テーブル定義書(.xls)に貼り付けることを想定してテキストデータを作ります。
  • Access のテーブルを Oracle 用 にするので、 例えばテキストのカラムは VARCHAR2 として表示されます。
  • システムテーブルは出力しません(コードを一部変更すれば出力できます)。
  • リンクテーブルは、リンクの内容を表示します。 リンク先のテーブルの定義は出力しません。

使い方

  1. Excel を開きます。
  2. 開発ツール Visual Basic Editor を開きます。
  3. モジュールを追加します。
  4. ツールの参照設定から Microsoft DAO にチェックを入れます。
  5. 下のコードを貼り付けます。
  6. 関数 GetTableDefinitions を実行します。

続きを読む VBA: Access のテーブル定義を一覧で出す方法


SQL: 最初のNレコードを抽出する SELECT の書き方


SQL で最初の 限られたレコードを抽出する場合の SELECT文 の書き方です。

続きを読む SQL: 最初のNレコードを抽出する SELECT の書き方


Oracle: Group 化 の際に文字列を結合する


Group 化 する際に 文字列を カンマ区切りで結合する方法を 2つ 紹介します。

ストアドファンクション

ストアドファンクション を使って文字列を結合します。

このようなファンクションを作っておいて、 次のような SQL を実行します。

出力結果サンプル
GROUP_ID MEMBER_NAMES
1 A, B, C
2 D, E

もし、 MEMBER_NAMES の出力結果が文字列として長くなりすぎる場合は、 文字数の長さを調べて分岐処理を行うように ファンクション を変更すれば OK です。 末尾に “等” をつけたりもできます。 区切り文字を変更することもできます。

ファンクション内で使われている LTRAM(PARAM1, PARAM2) は、 PARAM1 の左端に、 PARAM2 があれば削除する関数です。 右側を削除する場合は RTRAM が使えます。

wm_concat

wm_concat という関数を使っても同じことができます。 Oracle(オラクル) のマニュアルにも載っていない関数なので、 オラクルのサポートは受けられないと思います。

上の SQL を実行すると、 AAAAA, BBBBB, CCCCC, DDDDD というような結果が出力されます。


同等の機能をもつ ListAgg 関数 が Oracle 11g R2 で 正式にサポートされました。

参考: Oracleの階層問い合わせ