過去ログ

                                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バイトまでで比較

としたいのですが、このようなことはできるのでしょうか。
できる方法を教えて下さい。

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : よろずや  ■日付 : 03/2/6(木) 22:45  -------------------------------------------------------------------------
   ▼つとむ さん:
>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句に、件の関数を記述します。

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : つとむ  ■日付 : 03/2/8(土) 10:55  -------------------------------------------------------------------------
   ▼よろずや さん:
>VBAで関数を作ります。
>引数は、Aテーブルにある項目とBテーブルにある項目の2つです。
>戻り値は、Boolean です。
>で、ご希望の条件に合致した時に True を返すようにします。
>
>SQL文中では、AテーブルとBテーブルは CROSS JOIN とし、
>WHERE句に、件の関数を記述します。

VBA関数の作成ですか。
やったことがないのですが、どうすればよいですか。

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : よろずや  ■日付 : 03/2/8(土) 12:25  -------------------------------------------------------------------------
   いろんなやりかたがありますが、わかりやすい方法で...
モジュールを新規作成して、次の様に記述します。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
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テーブル].[項目])));
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
参考になりますでしょうか。

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : つとむ  ■日付 : 03/2/10(月) 12:57  -------------------------------------------------------------------------
   ▼よろずや さん:

お礼が遅くなって申し訳ありません。
ありがとうございました。

非常に時間はかかりましたが動きました。
処理はしているのですが、いつまでたっても終了しません。
時間がかかっているみたいです。

別の方法というか、モジュールを作らずに、MidとかLeftとかを組み合わせた
ひとつの長い条件文でやったのですが、ODBCでエラーがでて結果が得られませ
んでした。

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : よろずや  ■日付 : 03/2/11(火) 13:39  -------------------------------------------------------------------------
   >別の方法というか、モジュールを作らずに、MidとかLeftとかを組み合わせた
>ひとつの長い条件文でやったのですが、ODBCでエラーがでて結果が得られませ
>んでした。
ODBCですか?
先に言ってよね。
データベースは何を使ってますか?
ORACLE? SQLServer? MSDE? mdb?

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : つとむ  ■日付 : 03/2/12(水) 12:10  -------------------------------------------------------------------------
   ▼よろずや さん:
>ODBCですか?
>先に言ってよね。
>データベースは何を使ってますか?
>ORACLE? SQLServer? MSDE? mdb?

すみません。
ORACLE8iです。
UNIX上にあるORACLEのデータベースからACCESS2000のクリエで抽出を
しています。

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : よろずや  ■日付 : 03/2/12(水) 21:23  -------------------------------------------------------------------------
   > 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内に作ります。

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : つとむ  ■日付 : 03/2/13(木) 12:19  -------------------------------------------------------------------------
   ▼よろずや さん:
CASEっていう文法を使うのですか。
はじめてしりました。

分岐処理なんですね。select文中で分岐が行えるので便利ですね。

ところで、WHEN句の後で、
WHEN句の前で式の値を求めて、WHEN句の後で値の検査(判定)をする
ような書き方はできないのですか。
例えば
  CASE SUBSTR(ou2,1,1)
  WHEN 'E' THEN SUBSTR(ou2,1,4)

oralce8iより上のバージョン?

>もし関数にしたいなら、CREATE FUNCTION ステートメントでORACLE内に作ります。
どのようにすればよいのですか。?

 ───────────────────────────────────────  ■題名 : Re:複数のテーブルからまたがっての抽出  ■名前 : よろずや  ■日付 : 03/2/13(木) 23:01  -------------------------------------------------------------------------
   > ところで、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;

ってな感じですかね。

 ───────────────────────────────────────  ■題名 : ありがとうございました。  ■名前 : つとむ  ■日付 : 03/2/14(金) 0:20  -------------------------------------------------------------------------
   ▼よろずや さん:
ありがとうございます。

> ところで、WHEN句の後で、
> WHEN句の前で式の値を求めて、WHEN句の後で値の検査(判定)をする
> ような書き方はできないのですか。
> 例えば
>   CASE SUBSTR(ou2,1,1)
>   WHEN 'E' THEN SUBSTR(ou2,1,4)

このような書き方は、oracle8iでは出来ないみたいです。
oracle9iからサポートされているみたいです。

 ───────────────────────────────────────  ■題名 : CREATE FUNCTION ステートメント  ■名前 : つとむ  ■日付 : 03/2/14(金) 19:04  -------------------------------------------------------------------------
   ▼よろずや さん:
sqlplusで、レスして頂いた関数を、CREATE FUNCTION ステートメントで
ORACLE内に作成したのですが、

「警告: ファンクションが作成されましたが、コンパイル・エラーがあります。」

というのが表示されました。

コンパイル・エラーの詳細を確認したいのですが、どうすれば確認が
できるのですか。
また、作成されたファンクション情報を参照したいのですが、どのような
SQL文を実行すればよいのですか。

 ───────────────────────────────────────  ■題名 : Re:CREATE FUNCTION ステートメント  ■名前 : よろずや  ■日付 : 03/2/15(土) 15:42  -------------------------------------------------------------------------
   >コンパイル・エラーの詳細を確認したいのですが、どうすれば確認が
>できるのですか。
>また、作成されたファンクション情報を参照したいのですが、どのような
>SQL文を実行すればよいのですか。

オラクルには、マネージャ(ナビゲータ?)とかいうソフトが付いてるはずです。
それで見れば、オラクル内に作ったものは全部詳細まで見えるはずです。

 ───────────────────────────────────────  ■題名 : これで確認できます。  ■名前 : 読む人  ■日付 : 03/2/17(月) 12:03  -------------------------------------------------------------------------
   select * from user_objects where object_type = 'FUNCTION';
で確認できます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 199