Page 199 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼複数のテーブルからまたがっての抽出 つとむ 03/2/6(木) 0:07 ┗Re:複数のテーブルからまたがっての抽出 よろずや 03/2/6(木) 22:45 ┗Re:複数のテーブルからまたがっての抽出 つとむ 03/2/8(土) 10:55 ┗Re:複数のテーブルからまたがっての抽出 よろずや 03/2/8(土) 12:25 ┗Re:複数のテーブルからまたがっての抽出 つとむ 03/2/10(月) 12:57 ┗Re:複数のテーブルからまたがっての抽出 よろずや 03/2/11(火) 13:39 ┗Re:複数のテーブルからまたがっての抽出 つとむ 03/2/12(水) 12:10 ┗Re:複数のテーブルからまたがっての抽出 よろずや 03/2/12(水) 21:23 ┗Re:複数のテーブルからまたがっての抽出 つとむ 03/2/13(木) 12:19 ┗Re:複数のテーブルからまたがっての抽出 よろずや 03/2/13(木) 23:01 ┣ありがとうございました。 つとむ 03/2/14(金) 0:20 ┗CREATE FUNCTION ステートメント つとむ 03/2/14(金) 19:04 ┣Re:CREATE FUNCTION ステートメント よろずや 03/2/15(土) 15:42 ┗これで確認できます。 読む人 03/2/17(月) 12:03 ─────────────────────────────────────── ■題名 : 複数のテーブルからまたがっての抽出 ■名前 : つとむ ■日付 : 03/2/6(木) 0:07 -------------------------------------------------------------------------
ACCESS2000なのですが、 クリエで、Aテーブルにある項目とBテーブルにある項目で、項目の 内容が一致したBテーブルの1レコードを出力したいのですが、この とき、比較する項目には、条件があります。 項目はCHAR(5)です。 項目の先頭が’A'の時は、先頭から4バイトまでで比較 項目の先頭が’B’の時は、先頭から4バイトまでで比較 項目の先頭が’Z’の時は、先頭から5バイトまでで比較 先頭が、A,,B、Z以外(上記外)で、3バイト目が’Z’の時は、 先頭から5バイトまでで比較 先頭が、A,,B、Z以外(上記外)で、3バイト目が’Z’でない時は、 先頭から3バイトまでで比較 としたいのですが、このようなことはできるのでしょうか。 できる方法を教えて下さい。 |
▼つとむ さん: >ACCESS2000なのですが、 >クリエで、Aテーブルにある項目とBテーブルにある項目で、項目の >内容が一致したBテーブルの1レコードを出力したいのですが、この >とき、比較する項目には、条件があります。 >項目はCHAR(5)です。 > >項目の先頭が’A'の時は、先頭から4バイトまでで比較 >項目の先頭が’B’の時は、先頭から4バイトまでで比較 >項目の先頭が’Z’の時は、先頭から5バイトまでで比較 >先頭が、A,,B、Z以外(上記外)で、3バイト目が’Z’の時は、 >先頭から5バイトまでで比較 >先頭が、A,,B、Z以外(上記外)で、3バイト目が’Z’でない時は、 >先頭から3バイトまでで比較 > >としたいのですが、このようなことはできるのでしょうか。 >できる方法を教えて下さい。 VBAで関数を作ります。 引数は、Aテーブルにある項目とBテーブルにある項目の2つです。 戻り値は、Boolean です。 で、ご希望の条件に合致した時に True を返すようにします。 SQL文中では、AテーブルとBテーブルは CROSS JOIN とし、 WHERE句に、件の関数を記述します。 |
▼よろずや さん: >VBAで関数を作ります。 >引数は、Aテーブルにある項目とBテーブルにある項目の2つです。 >戻り値は、Boolean です。 >で、ご希望の条件に合致した時に True を返すようにします。 > >SQL文中では、AテーブルとBテーブルは CROSS JOIN とし、 >WHERE句に、件の関数を記述します。 VBA関数の作成ですか。 やったことがないのですが、どうすればよいですか。 |
いろんなやりかたがありますが、わかりやすい方法で... モジュールを新規作成して、次の様に記述します。 −−−−−−−−−−−−−−−−−−−−−−−−−−−− Option Compare Database Option Explicit Function JKEY(Str As String) As String Select Case Left(Str, 1) Case "A", "B" JKEY = Left(Str, 4) Case "Z" JKEY = Left(Str, 5) Case Else If Mid(Str, 3, 1) = "Z" Then JKEY = Left(Str, 5) Else JKEY = Left(Str, 3) End If End Select End Function −−−−−−−−−−−−−−−−−−−−−−−−−−−− 一方クエリの方は、SQLビューで開いて、次の様に記述します。 −−−−−−−−−−−−−−−−−−−−−−−−−−−− SELECT Aテーブル.項目, Bテーブル.項目, JKEY([Aテーブル].[項目]) AS 式1 FROM Aテーブル, Bテーブル WHERE (((JKEY([Aテーブル].[項目]))=JKEY([Bテーブル].[項目]))); −−−−−−−−−−−−−−−−−−−−−−−−−−−− 参考になりますでしょうか。 |
▼よろずや さん: お礼が遅くなって申し訳ありません。 ありがとうございました。 非常に時間はかかりましたが動きました。 処理はしているのですが、いつまでたっても終了しません。 時間がかかっているみたいです。 別の方法というか、モジュールを作らずに、MidとかLeftとかを組み合わせた ひとつの長い条件文でやったのですが、ODBCでエラーがでて結果が得られませ んでした。 |
>別の方法というか、モジュールを作らずに、MidとかLeftとかを組み合わせた >ひとつの長い条件文でやったのですが、ODBCでエラーがでて結果が得られませ >んでした。 ODBCですか? 先に言ってよね。 データベースは何を使ってますか? ORACLE? SQLServer? MSDE? mdb? |
▼よろずや さん: >ODBCですか? >先に言ってよね。 >データベースは何を使ってますか? >ORACLE? SQLServer? MSDE? mdb? すみません。 ORACLE8iです。 UNIX上にあるORACLEのデータベースからACCESS2000のクリエで抽出を しています。 |
> ORACLE8iです。 クエリは、パススルークエリにして下さい。 > 別の方法というか、モジュールを作らずに、MidとかLeftとかを組み合わせた > ひとつの長い条件文でやったのですが、ODBCでエラーがでて結果が得られませ > んでした。 SELECT Aテーブル.項目, Bテーブル.項目 FROM Aテーブル, Bテーブル WHERE CASE WHEN SUBSTR(Aテーブル.項目,1,1) = 'A' THEN SUBSTR(Aテーブル.項目,1,4) WHEN SUBSTR(Aテーブル.項目,1,1) = 'B' THEN SUBSTR(Aテーブル.項目,1,4) WHEN SUBSTR(Aテーブル.項目,1,1) = 'Z' THEN SUBSTR(Aテーブル.項目,1,5) WHEN SUBSTR(Aテーブル.項目,3,1) = 'Z' THEN SUBSTR(Aテーブル.項目,1,5) ELSE SUBSTR(Aテーブル.項目,1,3) END = CASE WHEN SUBSTR(Bテーブル.項目,1,1) = 'A' THEN SUBSTR(Bテーブル.項目,1,4) WHEN SUBSTR(Bテーブル.項目,1,1) = 'B' THEN SUBSTR(Bテーブル.項目,1,4) WHEN SUBSTR(Bテーブル.項目,1,1) = 'Z' THEN SUBSTR(Bテーブル.項目,1,5) WHEN SUBSTR(Bテーブル.項目,3,1) = 'Z' THEN SUBSTR(Bテーブル.項目,1,5) ELSE SUBSTR(Bテーブル.項目,1,3) END もし関数にしたいなら、CREATE FUNCTION ステートメントでORACLE内に作ります。 |
▼よろずや さん: CASEっていう文法を使うのですか。 はじめてしりました。 分岐処理なんですね。select文中で分岐が行えるので便利ですね。 ところで、WHEN句の後で、 WHEN句の前で式の値を求めて、WHEN句の後で値の検査(判定)をする ような書き方はできないのですか。 例えば CASE SUBSTR(ou2,1,1) WHEN 'E' THEN SUBSTR(ou2,1,4) oralce8iより上のバージョン? >もし関数にしたいなら、CREATE FUNCTION ステートメントでORACLE内に作ります。 どのようにすればよいのですか。? |
> ところで、WHEN句の後で、 > WHEN句の前で式の値を求めて、WHEN句の後で値の検査(判定)をする > ような書き方はできないのですか。 > 例えば > CASE SUBSTR(ou2,1,1) > WHEN 'E' THEN SUBSTR(ou2,1,4) 私の知っている古いバージョンでは、できないようです。 SQLServer では出来ました。 > oralce8iより上のバージョン? 今は確認できません。 > >もし関数にしたいなら、CREATE FUNCTION ステートメントでORACLE内に作ります。 > どのようにすればよいのですか。? CREATE FUNCTION jkey(str IN CHARACTER) RETURN CHARACTER AS result CHARACTER; BEGIN IF SUBSTR(str,1,1) = 'A' THEN result := SUBSTR(str,1,4); ELSEIF SUBSTR(str,1,1) = 'B' THEN result := SUBSTR(str,1,4); ELSEIF SUBSTR(str,1,1) = 'Z' THEN result := SUBSTR(str,1,5); ELSEIF SUBSTR(str,3,1) = 'Z' THEN result := SUBSTR(str,1,5); ELSE result := SUBSTR(str,1,3); END IF; RETURN result; END; ってな感じですかね。 |
▼よろずや さん: ありがとうございます。 > ところで、WHEN句の後で、 > WHEN句の前で式の値を求めて、WHEN句の後で値の検査(判定)をする > ような書き方はできないのですか。 > 例えば > CASE SUBSTR(ou2,1,1) > WHEN 'E' THEN SUBSTR(ou2,1,4) このような書き方は、oracle8iでは出来ないみたいです。 oracle9iからサポートされているみたいです。 |
▼よろずや さん: sqlplusで、レスして頂いた関数を、CREATE FUNCTION ステートメントで ORACLE内に作成したのですが、 「警告: ファンクションが作成されましたが、コンパイル・エラーがあります。」 というのが表示されました。 コンパイル・エラーの詳細を確認したいのですが、どうすれば確認が できるのですか。 また、作成されたファンクション情報を参照したいのですが、どのような SQL文を実行すればよいのですか。 |
>コンパイル・エラーの詳細を確認したいのですが、どうすれば確認が >できるのですか。 >また、作成されたファンクション情報を参照したいのですが、どのような >SQL文を実行すればよいのですか。 オラクルには、マネージャ(ナビゲータ?)とかいうソフトが付いてるはずです。 それで見れば、オラクル内に作ったものは全部詳細まで見えるはずです。 |
select * from user_objects where object_type = 'FUNCTION'; で確認できます。 |