今日もエラーが出ました。
ORA-01799: 列は副問合せに対して外部結合されません。
下のように解決しました。 (使っているデータベースは Oracle 10g か 11g のどっちかでした。)
事例 1
エラーが出たのは次の結合条件。
|
LEFT JOIN JNYUKA FNY ON FNY.BUNNO = (SELECT MAX(SNY.BUNNO) FROM JNYUKA SNY WHERE SNY.BUNNO <= MAIN.BUNNO) |
LEFT JOIN
で結合するテーブルの結合条件に副問合せをつかうと駄目みたいです。
期待する結果
上のコードでやりたいのは、 JNYUKA.BUNNO
がメインテーブルの値(MAIN.BUNNO
)以下になっているもので、最大のものをとることです。下のように。
MAIN BUNNO |
JNYUKA BUNNO |
FNY BUNNO |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
|
2 |
上のコードではエラーがでます。 カーソルを使っていったんテーブルに入れるのも面倒です。そこで・・・
|
LEFT JOIN JNYUKA FNY ON FNY.BUNNO <= MAIN.BUNNO AND NOT EXISTS(SELECT 1 FROM JNYUKA SNY WHERE SNY.BUNNO > FNY.BUNNO AND SNY.BUNNO <= MAIN.BUNNO) |
このようにすればエラーはでません。 BUNNO
がメインテーブル以下のものをすべて結合した後で、最大のもののみに絞り込むイメージ。
事例 2
別の例があったので・・・
Oracleで子テーブルの最新を外部結合できない!? で次のコードを見つけました。
|
select member.* from MEMBER member left outer join MEMBER_LOGIN memberLogin on member.MEMBER_ID = memberLogin.MEMBER_ID and memberLogin.LOGIN_DATETIME = (select max(MEMBER_LOGIN.LOGIN_DATETIME) from MEMBER_LOGIN where MEMBER_LOGIN.MEMBER_ID = member.MEMBER_ID) |
この場合だと
|
select member.* from MEMBER member left outer join MEMBER_LOGIN memberLogin on member.MEMBER_ID = memberLogin.MEMBER_ID and not exists(select MEMBER_LOGIN.MEMBER_LOGIN_DATATIME from MEMBER_LOGIN where MEMBER_LOGIN.MEMBER_ID = member.MEMBER_ID and memberLogin.LOGIN_DATATIME < MEMBER_LOGIN.LOGIN_DATATIME) |
とすればいいことになります。
ON
ではなくて JOIN
の中に条件を入れてしまう方法でも解決できます。
Oracle では、PL/SQL や CREATE 文 をファイルにしておいて、ファイルにしたスクリプトを実行することができる。
(Windows では) plsql を開き、下のように@マークの後にファイル名を続けて書いて Enter を押せば OK だ。
@"C:Folderxxx.sql"
続きを読む 複数のSQLを一度に実行するためのスクリプト →
Microsoft Office Accessのファイル(.mdb)の中のテーブル定義一覧を、 Oracle用のテーブル定義に変換して、一覧で出力するコードを紹介します。
概要
- Excel と VBA を使用します。
- VBA の 関数
GetTableDefinitions
を実行すると、 開いているエクセルのシートにアクセスファイル内のテーブル定義を一覧出力します。
- テーブル定義書(.xls)に貼り付けることを想定してテキストデータを作ります。
- Access のテーブルを Oracle 用 にするので、 例えばテキストのカラムは
VARCHAR2
として表示されます。
- システムテーブルは出力しません(コードを一部変更すれば出力できます)。
- リンクテーブルは、リンクの内容を表示します。 リンク先のテーブルの定義は出力しません。
使い方
- Excel を開きます。
- 開発ツール Visual Basic Editor を開きます。
- モジュールを追加します。
- ツールの参照設定から Microsoft DAO にチェックを入れます。
- 下のコードを貼り付けます。
- 関数
GetTableDefinitions
を実行します。
続きを読む VBA: Access のテーブル定義を一覧で出す方法 →
SQL で最初の 限られたレコードを抽出する場合の SELECT文 の書き方です。
続きを読む SQL: 最初のNレコードを抽出する SELECT の書き方 →
Group 化 する際に 文字列を カンマ区切りで結合する方法を 2つ 紹介します。
続きを読む Oracle: Group 化 の際に文字列を結合する →
A Life Summary of an Gypsy