• ベストアンサー

データの更新について

csvなどのテキストファイルからデータを取り込んで会員テーブルに更新するSQLを作成したくて考えています。 csvファイル 項目1:会員コード 項目2:名称 項目3:電話番号 いいやり方ではないと思いますがうまくいった方法を以下に書きます。 (1)ワークテーブル作成(csvと同じ項目) テーブル名:ワーク会員 項目1:会員コード 項目2:名称 項目3:電話番号 (2)UPDATE文実行 update 会員 K1 set 名称 = (select K2.名称 from ワーク会員 K2 where K2.会員コード = K1.会員コード), 電話番号 = (select K3.電話番号 from ワーク会員 K3 where K3.会員コード = K1.会員コード) where K1.会員コード IN (select 会員コード from ワーク会員 ) ブサイクな方法でしょうか? 他にもっといい方法があればアドバイスお願いします。

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

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

update 会員 K1 set (名称,電話番号) = (select K2.名称, K2.電話番号 from ワーク会員 K2 where K2.会員コード = K1.会員コード), where K1.会員コード IN (select 会員コード from ワーク会員 ) #Oracleオンリーですので。

toshi_200578
質問者

お礼

自分の方法より全然きれいですね。 ありがとうございます。 参考にさせて頂きます。

その他の回答 (1)

回答No.2

オラクルのバージョンが判りませんので、使えるかどうか判りませんが.. >(1)ワークテーブル作成(csvと同じ項目) 9i以降の機能ですが、外部表というテーブルを作ることで、ワークテーブルを用いずに、 直にCSVテキストファイルをSQL文での問い合わせに使用できます。 一度しか使わないデータであれば、ワークテーブルにロードするよりも合理的に処理できる 可能性が高いです。 >(2)UPDATE文実行 CSVテキストを外部表でアクセスする場合、索引がないので、更新SQLの際の記述によっては 合理的なアクセスがされないケースがあります。 ワークテーブルを経由する場合も索引が無い場合は同様です。 (更新する値を連れてくる”相関副問い合わせ”が全表アクセスになる場合があるから) これもオラクルのバージョンによりますが、”外部表”や”索引なしのワークテーブル”を基に プライマリキーのあるテーブルを更新するなら、”更新可能ビューに対する更新”を試行すると 処理効率的に良い結果を生むかも知れません。

toshi_200578
質問者

補足

説明が足りず、申し訳ありません。 バージョンはOracle9iです。 なにぶんまだ経験が浅いものでおっしゃる意味がなかなか理解できずにいますので質問させてください。 「直にCSVテキストファイルをSQL文での問い合わせ」 どのようなSQL文で対応できるのでしょうか? 「更新可能ビューに対する更新」 更新対象テーブルはプライマリキーはあります。が、 上記方法がわかりません。ご教授お願いします。

関連するQ&A

  • 結合が上手くいきません

    以下のテーブルがあるとします table1 名前|住所コード|勤務地コード table2 コード|名称 テーブル1の検索結果にテーブル2の名称を引っ張ってきて取得したいのですがどうやるのでしょうか? SELECT * from table1 INNER JOIN table1.住所コード ON table2.コード INNER JOIN table1.勤務地コード ON table2.コード これではうまくいきませんでした。 SELECT (select 名称 from table2 where table2.コード=table1.住所コード),(select 名称 from table2 where table2.コード=table1.勤務地コード) FROM table1 これは上手くいくのですが重いらしいので、、、

    • ベストアンサー
    • MySQL
  • Accsess2003にて2回目のデータ表示がおかしい

    助けてください!! テーブルに会員データ以外に支部テーブル、部会テーブルがあります。 部会テーブルには、支部コード,部会コード,部会名があります。 会員テーブルには、支部コード,部会コードはありますが、それぞれの名称はありません。画面表示には、各名称を表示するようにしています。 1回目の読込は、通常に表示しますが、2回目に別会員を読み込むとき どうしても1回目の支部コードの部会コードを読込んでしまいます。 例えば各テーブルが下記の時、1回目支部テーブル01 部会テーブル01 の場合 「ははは」を表示します。 2回目 支部テーブル02 部会テーブル02 の場合 「ひひひ」を表示します。正解は「みみみ」です。     支部テーブル 01 あああ 02 いいい     部会テーブル 01 01 ははは 01 02 ひひひ            02 01 ままま 02 02 みみみ  簡単なプログラムですが悩んでいます。是非是非、アドバイスお願い致しますm(__)m        Public Function 会員データ読み込み(会員番号 As String) As Integer Dim データベース As Database, レコード As Recordset Dim SQLステートメント 会員データ読み込み = 0 'return値設定。 SQLステートメント = "select * from 会員情報テーブル where 会員番号='" & 会員番号 & "'" Set データベース = CurrentDb Set レコード = データベース.OpenRecordset(SQLステートメント) If レコード.EOF = True Then '指定されたコードがない。 : End If With レコード Me!会員名 = !会員名 Me!フリガナ = !フリガナ Me!事業所名 = !事業所名 Me!業種1 = !業種1 Me!支部 = !支部 Me!部会 = !部会 Me!隠し支部 = Me!支部.Column(1) Me!隠し部会 = Me!部会.Column(2) Me!会員種別 = !会員種別 : 中略 退会FLG = !退会フラグ SQLステートメント = "select 部会テーブル.支部コード, 部会テーブル.部会コード, * FROM 部会テーブル WHERE (((部会テーブル.支部コード)='" & Me!支部 & "') AND ((部会テーブル.部会コード)='" & Me!部会 & "'));" Me!隠し部会 = Me!部会.Column(2) End With レコード.Close データベース.Close Set データベース = Nothing End Function

  • SQLで同じフィールドを2つ取りだしたい

    以下のテーブルからCSVを出力する際、 ID | 名称 | コード1 | コード2 1 |  A  |  111  |  444 2 |  B  |  222  |  555 3 |  C  |  333  |  666 「ID/名称/コード1コード2」のように取りだす場合のSQL文は SELECT ID, 名称, コード1 || コード1 FROM テーブル名 となると思いますがこれを、「ID/名称コード1/名称コード2」のように同じフィールドを同じ行に2回登場させたい場合はどうすれば宜しいでしょうか。 SELECT ID, 名称 || コード1, 名称 || コード2 FROM テーブル名 とした場合にはエラーになってしまいます。 宜しくお願い致します。

  • oracle 複数列を1列にまとめる

    oracle 複数列のデータ中身を別のテーブルの1列にインサートしたい ご存知の方、オラクルプロの方、 若輩者の私にアドバイス等ご指導受けたまりたく存じます。 以下のようなテーブルがあったとします。 テーブルA MID | K1 | K2 |K3 ------------------------- 011 |ああ |いい |うう  012 |ええ |おお |かか 特定の列を選択しての、Updateには成功しました。 update テーブルA set K1 = (select K1|| ' ' ||K2|| ' '||K3 from テーブルA where MID = '011') where MID = '011'; これを別のテーブルに全行Insertしたいのです。約5千行はあり、環境の制限によりSQL文のみしか使えません。 テーブルB MID |K1 ----------------------- 011 |ああ いい うう 012 |ええ おお かか 以下のようなSQLで正しいでしょうか? insert into テーブルA (K1) select K1|| ' ' ||K2|| ' '||K3 from テーブルB; 上記の方法で実施しましたが、下記のようなエラーメッセージが表示されます。MID項目が主キーのため、NULL不可なことはわかりますが、指定していないMIDが何故でてくるのでしょう? SQL Error: ORA-01400: テーブルA (MID) にはNULLは挿入できません。 環境情報: Oracle 10g  検証環境:Oracle SQL Developerあり 本番環境:Oracle SQL Developerなし、SQLのみ使用可

  • SQLでSELECTした一覧をUPDATEする方法を教えてください。

    AのテーブルをINNER JOINのWHERE文を用いて、selectした結果の項目にBテーブルの内容をUPDATEしたいのですが、 下記方法でうまくいきません。 解決方法を教えてください。 よろしくお願いいたします。 SELECT A.PointZan FROM A INNER JOIN B ON A.Code = B.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止') UPDATE A SET PointZan = (SELECT B.PointZan FROM B INNER JOIN A ON B.Code = A.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止'))

  • 複数テーブルからデータ取得について

    初めて投稿します。よろしくお願いします。 SQLを使うのが初めてなので勉強をしながら作業を行なっています。そのため説明不足などありましたらご指摘願います。 [環境]  データベース:SQLServer2003 下記SQL文より、該当データの抽出は出来たのですが、 この3つのSQL文を一つのSQL文にて該当データを取得したいのですが、なかなか解決出来ないので宜しくお願いします。 SELECT isnull(会員CD,' '), isnull(郵便番号,' '), isnull(住所,' '), isnull(番地,' '), isnull(方書,' '), FROM KAIINMST AS A WHERE 更新カウンター = (SELECT MAX(更新カウンター) FROM KAIINMST WHERE A.会員CD = 会員CD) GROUP BY 会員CD,郵便番号,住所,番地,方書 ORDER BY 会員CD SELECT isnull(会員CD,' '), isnull(送付郵便番号,' '), isnull(送付住所,' '), isnull(送付番地,' '), isnull(送付方書,' '), FROM KAIINSOF AS A WHERE 更新カウンター = (SELECT MAX(更新カウンター) FROM KAIINSOF WHERE A.会員CD = 会員CD) AND 業務CD = "20" GROUP BY 会員CD,送付郵便番号,送付住所,送付番地,送付方書 ORDER BY 会員CD SELECT isnull(会員CD,' '), isnull(代理会員CD,' '), isnull(会員区分,' ') FROM DAIRI AS A WHERE 更新カウンター = (SELECT MAX(更新カウンター) FROM DAIRI WHERE A.会員CD = 会員CD) AND 業務CD = "20" GROUP BY 会員CD,代理会員CD,会員区分 ORDER BY 会員CD KAIINMSTテーブルをLEFT JOIN で他のテーブルデータを結合して欲しいです。 KAIINMASTの会員CDに対して他テーブルの該当データが存在しない場合は、NULLを設定して下さい。 以上です。宜しくお願いします。

  • SQLSever 一括インポートについて

    SQLserver で大量にあるCSVファイルをインポートしたいのですが コードが分かりません。 各Csvファイルには1行目に列名が書かれており、全て同じ構成となっております。 MSDNで調べて下記コードを見つけたのですがうまく起動しません。 「列名 'IntCol' が無効です。」と出てしまいます。 ------------------------------------------------------------ -- Query before update shows initial state of XmlCol values. SELECT * FROM T UPDATE T SET XmlCol =( SELECT * FROM OPENROWSET( BULK 'C:\SampleFolder\SampleData3.txt', SINGLE_BLOB ) AS x ) WHERE IntCol = 1 GO ------------------------------------------------------------ 単純に 「同じ構成の複数あるcsvファイルを1つのテーブルにインポートする」 というコードなのですが、どうやればよいのでしょうか?

  • db2にて複数列の副照会を行いたい

    db2にて複数列の副照会を行いたい 会員番号の中で直近の利用日の明細を取得したい 例) SELECT 会員番号,利用日,利用目的,使用器具 FROM 明細テーブル      WHERE (会員番号,利用日) = (SELECT 会員番号,MAX(利用日) FROM 明細テーブル GROUP BY 会員番号) どなたかヒントをお願いします

  • UPDATE文(副問合せ?)について

    うまく説明できないのですが、下記のようなテーブルがあります。 テーブル名:A 項目: A1 A2 A3 A4 AテーブルのA1項目に「5」がセットされているデータについて、 A2に123、A3に321をセットしたいのです。 うまくいかない例ですが、下記のようなイメージです。 UPDATE A set A2=123,A3=321 FROM (SELECT * FROM A WHERE A1 = '5') ちなみに下の書き方はダメです。 「SELECT * FROM A WHERE A1 = 5」の部分は、必ず使用し、変更不可です。 × UPDATE A set A2=123,A3=321 WHERE A1 IN(SELECT A1 FROM A WHERE A1 = 5) 変な質問ですいませんが、何か方法があるのでしょうか。 よろしくお願いします。

  • select for updateのロック

    オラクルのselect for updateでロックをするタイミングがいつですか? こんなPL/SQLのコードがあったとします。 ---↓↓↓ソースコードここから↓↓↓------------------------- select * from テーブル1 where id = 1 for update; ・・・・・(a) ~ update テーブル1 set kingaku=100 where id = 1 ・・・・・(b) ~ commit; ---↑↑↑ソースコードここまで↑↑↑------------------------- id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか? また、このロックは ・他トランザクションから読めるけど更新できない ・他トランザクションからは読むことすらできない のどちらでしょうか? よろしくお願いします。