• 締切済み

INSERTを行う際に別の表のデータを使用する方法について

Java(Servlet,jsp)、MySQL、Tomcatを使用して開発をしています。 INSERTを行う際に別の表のデータを使用したいのですが、 上手くいきません。 ご教授願いただけますと幸いです。 ■テーブル名:A_mst ■カラム 名前: Name 誕生日: Birthday 都道府県コード: Prefecture_Cd 住所: Address ■テーブル名:B_mst ■カラム 都道府県コード: Prefecture_Cd 都道府県名: Prefecture_Name ■処理内容 パラメーターから取得した「名前、誕生日、都道府県、住所」をA_mstに登録する。 ※A_mstには都道府県列はないため、B_mstから都道府県コードを取得しなければなりません。 String sql = "INSERT INTO A_mst" +"SELECT Prefecture_Name FROM B_mst" +"WHERE Prefecture_Name = Prefecture_Name" +"(Name,Birthday,Prefecture_Cd,Address)" +"values('#1','#2','#3','#4')"; sql = sql.replaceAll("#1",strNname); sql = sql.replaceAll("#2",strBirthday); sql = sql.replaceAll("#3",strPname); sql = sql.replaceAll("#4",strAddress); バージョンは以下になります。 jdk1.6.0_16 Tomcat 6.0 MySQL Server 5.1 何卒よろしくお願いいたします。

  • MySQL
  • 回答数2
  • ありがとう数2

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

そもそも・・・ A_mstにPrefecture_Cdがあるのですから埋め込む必要がないでしょう? なんのために正規化しているかもう一度よく考え直したほうがよいのでは?

SEC_60
質問者

お礼

お忙しいところ回答いただきありがとうございました。 正規化についてもう少し勉強を重ねたいと思います。

回答No.1

>上手くいきません。 具体的なアドバイスを得たいなら、具体的にどううまく行かないのか提示するようにしてください。 insert~selectの構文が間違っているようですが、組み立てたSQLを確認していますか? こんな感じでは? insert into A_mst select 名前のパラメタ, 年齢のパラメタ, 都道府県コード, 住所のパラメタ from B_mst where 都道府県名=都道府県のパラメタ

SEC_60
質問者

お礼

質問が具体的でなくて申し訳ございませんでした。 うまくいかない箇所は「B_mastからPrefecture_Cdを取ってくる」という部分ですが、 試行錯誤した結果以下のSQLで取得することができました。 お騒がせしました。 insert into A_mst set Name='#1', Birthday='#2', Prefecture_Cd=(select Prefecture_Cd from B_mst where Prefecture_Name='#3'), Address='#4'; お忙しいところアドバイスいただきありがとうございました。

関連するQ&A

  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • array値を別のテーブルへインサートしたい。

    phpとmysqlを見よう見まねでやっている 初心者です。 atableのチェックボックスよりPOSTした $sample_array(atable.indexの値が複数です。) をbtableへ移動したいと思い、以下の式を自分なりに 考えてみましたが上手くbtableへinsert されません。 atableの複数のindexは選ばれているようですが それをどうしたらbtableへ複数insertできるのか良くわかりません。 何が間違っているのか、atableからbtableへ複数insertできる式を 具体的に書いて頂くと大変助かります。 どうかご教授の程よろしくお願い致します。 $sample_array = $_POST['sample_array']; $where=""; if (isset($sample_array) and is_array($sample_array)) { $where .=" AND atable.index in ("; foreach ($sample_array as $key=>$val) { if($key>0) $where .=","; $where .="'" .mysql_real_escape_string($val) . "'"; } $where .=")"; } $sql= "select * from atable"; $sql .= " where 1"; $sql .= $where; $result = mysql_query( $sql ); while ( $row = mysql_fetch_array( $result ) ) { $sql = "insert into btable (a_no,b_no,c_no) values ('" . $row['no_a'] . "', '" . $row['no_b'] . "','" . $row['no_c'] . "')"; }

    • ベストアンサー
    • PHP
  • プライマリキーのみを変更して、複数行insertする方法

    こんにちは。 oracle(9i)のテーブルにinsertを行おうと思っているのですが、 困っているので質問させていただきます。 Aテーブルに5カラムあるとします。 カラム1はプライマリキーです。 例えば、1レコードが下記のようになっているとします。 カラム1 カラム2 カラム3 カラム4 カラム5 ---------------------------------------------- 001 あああ いいい ううう えええ プライマリキーに1を足して、他のカラム2から5までは同様の内容で insetをしたいと思っています。 つまり、下記のようなレコードになります。 002 あああ いいい ううう えええ 003 あああ いいい ううう えええ このようにプライマリキーのみを変更して200レコードくらいを insertしたいと思いますが、どのようにすればよいでしょうか。 できれば、PL/SQLかSQLのスクリプトで実行したいと思います。 ご存知の方、ご教授願います。 よろしくお願いいたします。

  • phpでのSQLでのデータの追加方法

    phpでのSQL実行に関して、下記のデータを追加するコードがあります。 mysql_query('INSERT INTO my_items SET maker_id=1, item_name="もも", price=210, keyword="缶詰,ピンク,甘い", sales=0, created="2010-08-01", modified="2010-08-01"') or die(mysql_error()); echo 'データを挿入しました'; 私は。それを INSERT INTO (フィールド名) VALUES(値) のSQL文で実行したいのですが、その方法が分かりません。 よろしければ、それを実行するコードを教えてください。お願いします。

    • ベストアンサー
    • PHP
  • CakePHPとMySqlを使用しています。INSERTしたあと、id

    CakePHPとMySqlを使用しています。INSERTしたあと、idを取得する方法について教えて頂きたいです。 データをINSERTとSELECTをする関数を作成し、 メインの関数でINSERTとSELECTをする関数を呼び出すと、idがNULLとなってしまいます。 しかし、1つの関数でINSERTとSELECTを行うとidを取得する事ができました。 この方法は問題ないのでしょうか? この方法だとなぜidが取得できるんでしょうか? また、これ以外の方法でidを取得できる方法があればお教え頂きたいです。 宜しくお願いします。 【hogeテーブル】 id(PRIMARY。オートインクリメントさせています) name ●idがNULLになる方法 function main() { $this->insertHoge(); $id = $this->getHoge(); ←結果がNULLになる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($sql); return $result; } function getHoge() { $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($sql); return $result; } ●idが取得できる方法 function main() { $id = $this->insertHoge(); ←idがかえってくる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($_sql); $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($_sql); return $result; }

    • 締切済み
    • PHP
  • PostgreSQLで一致した順にソート

    いつもお世話になっております。 早速質問させていただきます。 <memberテーブル> birthday(生年月日) graduate_cd(学歴コード) prefecture_cd(都道府県コード) があります。 <pointテーブル> min_age_cd(最小年齢コード) max_age_cd(最大年齢コード) graduate_cd(学歴コード) prefecture_cd(都道府県コード) があります。 memberテーブルのbirthdayは以下の式で年齢を割り出しています。 extract(year from age(now(), birthday)) as age やりたいことは・・・ (1) point.min_age_cd<=member.age and max_age_cd>=point.max_age_cd の場合マッチ。 (2) point.graduate_cd=member.graduate_cd の場合マッチ。 (3) point.prefecture_cd=member.prefecture_cd の場合マッチ。 ただ、point.prefecture_cdには、カンマ区切りで複数の prefecture_cdが格納されていますので、正規表現になるのでしょか? 正規表現の方法も教えていただきたいです。 (1)~(3)のマッチした数が多い順にソートをしたいと思っています。 皆さま、ご教授お願いいたします。 <環境> OS:Linux PostgreSQL Version:7.3.18 PHP Version:4.3.2

  • 別のDB(Table)からの複数行のINSERT

    Wordpressにあるusermetaというテーブルに、 別のDBのテーブルからデータをINSERTしたいのですが、 #1241 - Operand should contain 1 column(s) というエラーが表示されてうまくいきませんでした。 具体的なSQL文は、 insert into ***_usermeta (umeta_id,user_id,meta_key,meta_value) select (null,tableBid,'first_name',''), (null,tableBid,'last_name',''), (null,tableBid,'nickname',tableBname), (null,tableBid,'***_capabilities','a:1:{s:10:\"subscriber\";b:1;}'), (null,tableBid,'***_user_level','0') from dbB.tableB where tableBname<> 'Admin' dbBのtableB にあるAdmin行以外を対象としています。 実際にはもう少しデータが多いのですが、select (null,uid,'first_name','') from ・・・ だけにしても同じエラーが出ましたので、構文の書き方が間違っていると感じています。 (別のDBではなく、同じDBの別のTableからのINSERTでも同じエラーが表示されました) 上記のようなケースの場合、どのようにSQL文を書けばよいのでしょうか? お分かりになられる方がいらっしゃいましたら、ご教示頂けますと幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • データの取得方法

    失礼いたします。 SQL文でDBからデータを取得して、それを 表示したいのですがうまくいきません。 どこを間違っているか、どうしたらいいか コメントお願いします。 //他のページからIDを取得 <?php $aid=htmlspecialchars($_GET["id"]); ?> //SQL <?php $sql = "SELECT A.USERID,A.NAME,B.BIL_ID,B.B.BIL_NAME FROM USER A,BIL B WHERE A.BIL_ID=B.BIL_ID AND USER_ID=".intval($_GET["aid"]); !$an = mysql_query($sql,$db) $user = mysql_fetch_row($an); mysql_free_result($an); ?> //データの表示 //SQLで実行した'BIL_ID'を表示したい。 <TD><INPUT type="text" name="bid" value="<?php print(intval($_GET["$user[2]"])) ?>"></TD>

    • ベストアンサー
    • PHP
  • Access にて DISTINCROW を使用した INSERT SELECT

    お世話様です。 Access2003 VBAにて、DoCmd.RunSQLを使用してSQL文を流す際、 普通のINSERT-SELECT文はOKですが、 そのSELECT文にDISTINCROW句を使用していると、 数百件程度のSELECT結果しかINSERTできません。 本当は数千件のSELECT結果をINSERTしたいのですが、 これを実行した場合、エラーにもならず、1レコードもINSERTされません。 ためしに、DINSTINCTROWではなく、SQL文を変更してDISTINCTにしてみたところ、 2000件以上でもINSERTできました。 DISTINCROW句を使用して数千件でもINSERTできる方法はあるでしょうか? ちなみにSELECT単体ですと、DISTINCTROWを使用していながら、 数千件でも結果を表示できます。 SQL例: str_SQL = " INSERT INTO 結果テーブル(フィールド1, フィールド2, フィールド3)  SELECT DISTINCTROW A.項目1, A.項目2, B.項目1  FROM テーブル1 A, テーブル2 B  (WHERE句はあってもなくても現象変わらず)  ORDER BY A.項目4 ASC, A.項目5 ASC " DoCmd.RunSQL (str_SQL) よろしくお願いいたします。

  • データの取得方法

    Aテーブル{ id char(3) not null, name varchar(10), a_no char(5), b_no char(5), c_no char(5), date timestamp } Bマスタ{ no char(5), name char(10) } 上記のようなDBがあるのですがAテーブルのa_no、b_no、c_noに入るのはBマスタのnoになります。 下記のようにデータを取得したい場合、どうすればうまく取得できるのでしょうか。 A.id, A.name, A.a_no, カラム名をname1としてB.name, b_no, カラム名をname2としてB.name, c_no, カラム名をname3としてB.name そんなに難しいことではないと思うのですが、考えれば考えるだけ頭の中でこんがらがってきて困っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL