PL/SQLの質問

このQ&Aのポイント
  • テーブル「試験項目マスタ」と「クラスマスタ」があり、試験項目マスタの登録IDとクラスマスタの登録IDが同じ場合、2A列以降に丸印を付けたいです。
  • PL/SQL(ストアドプロシージャ)を使用して、「試験項目マスタ」と「クラスマスタ」のデータを結合し、条件に合致した箇所に丸印を付ける方法を教えてください。
  • お手数ですが、PL/SQLを使用して「試験項目マスタ」と「クラスマスタ」のデータを結合し、2A列以降に丸印を付ける方法を教えてください。
回答を見る
  • ベストアンサー

PL/SQLの質問

PL/SQLの質問 お世話になっております。 下記の様なテーブル「試験項目マスタ」と「クラスマスタ」が二つ有り、 オラクルのPL/SQL(ストアドプロシージャ)で、 「試験項目マスタ」の登録IDと「クラスマスタ」の登録IDが同じ場合、 2A列以降に丸印を付けていきたいのですが(説明が難しく、省略してい ますが、つまり下記の「結果」様にしたいのです。)、 どの様な記述をすれば良いのか分からず困っています。 どなたかご親切な方、ご教授頂きたく宜しくお願い致します。       記 「試験項目マスタ」 登録ID 大項目 中項目 小項目 2A  2B  2C  2D  2E  2F  2G  2H  2I  2J 2L 0001 学科試験 国語   古文 0002 学科試験 数学I 0003 学科試験 数学 0004 学科試験 化学 0005 学科試験 世界史 0006 学科試験 日本史 0007 学科試験 英語   英会話 0008 学科試験 体育   サッカー 0009 学科試験 音楽   合唱 0010 学科試験 技術 「クラスマスタ」 登録ID クラス 0001 2A 0001 2C 0001 2D 0001 2F 0001 2H 0001 2J 0002 2B 0002 2E 0002 2G 0002 2I 0002 2L  ・   ・  ・   ・  ・   ・  ↓ 結果 登録ID  大項目 中項目 小項目 2A  2B  2C  2D  2E  2F  2G  2H  2I  2J 0001  学科試験 国語   古文  ○      ○   ○      ○      ○     ○ 0002  学科試験 数学I            ○         ○       ○      ○ 0003  学科試験 数学 ・    ・    ・ ・    ・    ・ ・    ・    ・ ・    ・    ・

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

クラスマスタの登録IDクラスが試験項目マスタの登録ID(4桁)+試験項目マスタの更新カラム名(2桁)である前提で、 declare  cursor c1 is  select 試験項目マスタ.登録ID     ,substr(クラスマスタ.登録IDクラス,5,2) 更新カラム  from 試験項目マスタ   inner join クラスマスタ   on 試験項目マスタ.登録ID = substr(クラスマスタ.登録IDクラス,1,4)  order by 試験項目マスタ.登録ID  ;    w_sql varchar2(4000); begin  for r1 in c1 loop   w_sql := 'update 試験項目マスタ ';   w_sql := w_sql := 'set ' || r1.更新カラム ||' = ''○''';   w_sql := w_sql := 'where 試験項目マスタ.登録ID = ' || r1.登録ID;   execute immediate w_sql;  end loop;  commit; end; / とかでどうですか? update文を登録ID毎に実行したい気もしますが、とりあえずイメージだけでも。

miruchoko
質問者

お礼

ありがとうございます。 大変参考になりました。

関連するQ&A

  • ツリー情報のデータをSQLで取得したい

    SQLServer 2008 です。 以下のツリーデータの場合に A ┬C │├D ┬H ││ ├I ││ └J │└E B ┬F ┬I  │ └L  └G 次のようなデータを登録しています。 ┌──┬──┬──┐ │OYA │KO │Data│ ├──┼──┼──┤ │A │C  │"C" │ ├──┼──┼──┤ │A  │D  │"D" │ ├──┼──┼──┤ │A  │E  │"E" │ ├──┼──┼──┤ │B  │F  │"F" │ ├──┼──┼──┤ │B  │G  │"G" │ ├──┼──┼──┤ │D  │H  │"H" │ ├──┼──┼──┤ │D  │I  │"I" │ ├──┼──┼──┤ │D  │J  │"J" │ ├──┼──┼──┤ │F  │I  │"I" │ ├──┼──┼──┤ │F  │L  │"L" │ └──┴──┴──┘ 引数OYA="A"でSQLを実行した場合に 以下のような この引数を含むそれ以下のツリーに関する データを取得する方法を教えてください。 ┌──┬──┬──┐ │OYA │KO │Data│ ├──┼──┼──┤ │A │C  │"C" │ ├──┼──┼──┤ │A  │D  │"D" │ ├──┼──┼──┤ │A  │E  │"E" │ ├──┼──┼──┤ │D  │H  │"H" │ ├──┼──┼──┤ │D  │I  │"I" │ ├──┼──┼──┤ │D  │J  │"J" │ └──┴──┴──┘

  • 【SQL*Loader】固定長データのロードについて

    SQL*Loaderで固定長データを項目を指定してDBへロードしたいのですが・・・ 10件の項目があって例えば、 「A,B,C,D,E,F,G,H,I,J」とします。(全部6ビットでCHAR型とします。) このうち、「A,B,C,F,G,H」を指定してロードしたいとき、 おそらく「POSION」を使って制御ファイルを作成すると思います。 実際制御ファイルを作ってロードを試みたところ、 確かにDやEをすっ飛ばして、ロードできたました。 ところが、指定しなかった項目で残りの最後の項目であるIやJが 次のレコードとして認識されてしまうのです。 つまり、「A,B,C,F,G,H」を最初のレコードとして認識し、 続いて「I,J」をレコードとして認識しているのだと思います。 たぶん、IやJも指定してロードするとうまくいく気がします・・ でもI,Jはロードしたくない項目なのです・・・ このI,Jの前、つまり指定項目の最後のHでレコードを切って ここで一つのレコードとして終わらせるようにするような方法がないか 探しております。 どなたかご教示いただければと思います。 よろしくお願いします。

  • オラクルの外部結合について

    仮にテーブル類をこのように設定します テーブル  項目 ------------------- マスタ111...a,b,c,d,e マスタ222...f,g,h,i,j  ------------------- ※ マスタ111とマスタ222のKEYは(a = f,b = g)とします。 SQLの抽出にて、a~jまでの全ての項目をマスタ111 に存在する全てのデータのみ抽出したい (マスタ222に紐つくデータがない場合はf~j項目は空白として抽出) と思い、以下のような下のようなSQLとしてみましたが、これだとマスタ222に紐つくデータがない場合は抽出の対象外となってしまいました。 -------------------------- SELECT A.a      A.b      A.c      A.d      A.e      B.f      B.g      B.h      B.i      B.j FROM マスタ111 A,マスタ222 B WHERE A.a = B.f(+) AND A.b = B.g(+) -------------------------- マスタ222に紐つくデータがないマスタ111のデータも抽出したい場合は、どのようなSQLにしたら良いでしょうか? 宜しくご教授下さい。お願い致します。

  • SQLについての質問

    9iです。お世話になります。 次のSQLをどう書けばよいのか分かりませんのでご教示願います。 【テーブルA】 id code 1 1 2 2 3 (null) … 【マスタテーブルB】 code name 1   あ 2   い 【ほしい結果】 id name 1  あ 2  い 3 (null) … 要するにcodeがnullの所はnameをnullにして、nullでないところは、マスタから引っ張ってくるということがやりたいです。 宜しくお願いします。

  • ACCESSでの結合プロパティについて

    ACCESSでの結合プロパティは、3つあって、1つ目は2つのテーブルに共通するものだけを引っ張ってくる。 2つ目は片方の全部と、もう1方では、共通するものだけ。3つ目は、2つ目の逆。 両方のレコードを持ってくるということは出来ないのでしょうか? 例:「data」で結合して、表示は、今回厳密には定義しません。 テーブル1 ID data 1 a 2 b 3 c 4 d 5 e 6 f テーブルB ID data 4 d 5 e 6 f 7 g 8 h 9 I 10 j 結合プロパティ(1)では、 ID data 4 d 5 e 6 f 結合プロパティ(2)では、 ID data 1 a 2 b 3 c 4 d 5 e 6 f 結合プロパティ(3)では、 ID data 4 d 5 e 6 f 7 g 8 h 9 I 10 j となると思います。 今やりたいことは、全部持ってくることです。 ID data 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 I 10 j よろしくお願い致します。

  • SQLがわかりません。

    以下のTESTテーブルから以下の結果を表示するようなSQLを教えて頂けないでしょうか。 TESTテーブルでTYPE(1,2,3)を抽出して、2,1,3の順番にして それぞれのTYPEごとにDBIDでソートをしたいです。 どうかよろしくお願いいたします。 table TEST DBID | NAME | TYPE ------------------------------- 1 | A | 1 2 | B | 2 3 | C | 3 4 | D | 4 5 | E | 1 6 | F | 2 7 | G | 3 8 | H | 4 9 | I | 1 10 | J | 2 結果 DBID | NAME | TYPE ------------------------------- 2 | B | 2 6 | F | 2 10 | H | 2 1 | A | 1 5 | D | 1 9 | G | 1 3 | D | 3 7 | G | 3

  • エクセルで2列以上のものを同時に並び替えするには

    エクセルで下記のようなデーターがあるとします。 1 A  G     B  H 2 C  I  ○   D  J 3 E  K   F  L このようにひとつの項目に2行づつあるものに対して、最後に○をつけたものを先頭に2行そのまま一気に並び替えるにはどのようにすればよろしいでしょうか?要するに 2 C  I  ○   D  J 1 A  G     B  H 3 E  K   F  L このようにしたいです。 よろしくお願いいたします。

  • excel 関数作成の簡素化 ?

    A B C D E F G H I J 1784 1784 1781 1782 1809 1813 1821 1813 1784 1784 (1)A-B B-C C-D D-E E-F F-G G-H H-I I-J (1)0 3 -1 -27 -4 -8 8 29 0 (2)=SUMIF(A:I,">0",A:I) で 40になる 上記の(1)を使用せず (2)のように一気に出来ないか? もしも 表示が悪ければ 書き直し する為 回答不要

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • ACCESS2003でクエリの質問です

    クエリを教えて下さい。 ACCESS2003でクエリを作成したいのですが テーブルに以下のようにデータが入っています。 ID   日付   項目あ 項目い 項目う 項目え 項目お 001 2009/08/27  A         B    C 001 2008/08/27  D    E         F    G 002 2009/08/27       H         I 002 2008/08/27  K    L         M 002 2007/08/27  K    L    O    M 同一IDで日付の新しいレコードを抽出するのですが、 もしNULLの項目があれば、日付の古いレコードから編集したいです。 結果としては以下のようなテーブルを作成したいです。 [002]の[項目お]の様に過去日付のものがNULLであれば編集はしません。 ID   日付   項目あ 項目い 項目う 項目え 項目お 001 2009/08/27  A    E    B    C    G 002 2009/08/27  K    H    O    I また以下のように過去日付のデータが異なる場合は 事前のチェックでエラーとして別テーブルに出すように考えていますが、 こちらも合わせて教えていただけると助かります。 ID   日付   項目あ 項目い 項目う 項目え 項目お 003 2009/08/27  N    O    P         Q 003 2009/08/27  N    O    P    R    Q 003 2009/08/27  N    O    P    S    Q SQLが苦手で困っています。 宜しくお願いします。