UPDATE文で既存テーブルへのデータ振り分け登録

このQ&Aのポイント
  • テーブルが2つありまして、既存テーブルには担当者コードが入っておらず、その担当者コードフィールドへ既存テーブルの時刻からそれに合った担当者コードを担当者テーブルからを参照し登録する作業を行いたいです。
  • UPDATE文を使用して、既存テーブルに担当者コードを登録する方法について教えてください。
  • エラーが発生しているため、どのようにすれば正しくデータを振り分けることができるのか教えてください。
回答を見る
  • ベストアンサー

UPDATE文で既存テーブルへのデータ振り分け登録

テーブルが2つありまして、既存テーブルには 担当者コードが入っておらず(フィールドはあります)、その担当者コードフィールドへ既存テーブルの時刻からそれに合った担当者コードを担当者テーブルからを参照し登録する作業を行いたいのですが、1つのSQL文で可能なのでしょうか? 既存テーブル ID,InDate(時刻),UserCode(担当者コード) 1,2006-09-01 10:20:30,'' 2.2006-09-02 12:10:50,'' 担当者テーブル UserCode,UserName,StartTime,EndTime 111,ABC,2006-09-01 09:00:00,2006-09-01 13:30:00 222,DEF,2006-09-02 09:00:00,2006-09-01 13:30:00 の様なデータが合った場合 既存テーブルのID1のUserCodeへ111 既存テーブルのID2のUserCodeへ222 と入れるようなSQLを作成したいのです。 update 既存テーブル set usercode = (select b.usercode from 既存テーブル as a,担当者テーブル as b where a.InDate > b.starttime and a.InDate < b.endtime); と作成はしてみたものの ERROR: more than one row returned by a subquery used as an expression とエラー表示されます。 複数のレコードがあるからエラー?ってことなのでしょうか。 ver:PostgreSQL 8.1 どのようにすると、可能になるか教えてほしいのですが、どうぞよろしくお願いします。(説明がうまく出来ず申し訳ありません…)

  • muttu
  • お礼率27% (3/11)

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

  • ベストアンサー
回答No.1

担当者テーブルのUserCode=222のEndTimeは、9月2日のデータの誤りですね? update文にfrom句を使う指定方法があり、これを使うと簡単です。 update 既存テーブル set UserCode=担当者テーブル.UserCode from 担当者テーブル where InDate between StartTime and EndTime

muttu
質問者

お礼

早速の回答有り難うございます。 ご指摘の通り、9月2日のデータのEndTimeは2006-09-02の間違いです。 回答の通りSQLを作成した所、うまく動作する事が 出来ました。 有り難うございました。 申し訳ありませんが、もう1つあるのですが、 もし担当者コード222のEndTimeが入ってない場合 (その担当者が引き続き運用中の為、終了時刻が入っていない)も同様にID2の担当者コードには222と入れたいのですが方法はありますでしょうか。 度々申し訳ありませんが、よろしくお願いします。

その他の回答 (1)

回答No.2

>もし担当者コード222のEndTimeが入ってない場合 >(その担当者が引き続き運用中の為、終了時刻が入っ>ていない)も同様にID2の担当者コードには222と入れ>たいのですが方法はありますでしょうか。 終了時刻の入れ方にも、いろいろ方法がありますよね。 例えば、nullとする方法もありますが、この方法では、範囲や大小比較で「終了であること」を判別する仕組みが必要になります。 もっと簡単な方法が、最大値を入れる方法です。 例えば、「9999-12-31 23:59:59」をdefault値として設定したり、あるいは格納するようにしておけば、検索などの操作時のSQLは非常に単純にできます。 最初に最大値を入れておき、終了日時が確定した段階で、実際の終了日時で更新すればいいのです。

muttu
質問者

お礼

回答有り難うございます。 なるほど、デフォルト値として入れておけばいいのですね。思いつきませんでした。 これで全てうまく行くことが出来そうです。 分かり易く回答頂きありがとうごさいました。

関連するQ&A

  • 別テーブルの値をsetしてupdateしたい

    テーブルAとテーブルBで、idが一致したデータのみ、 テーブルAのフィールドにテーブルBの値を入れたいです。 tera termを使用して、 UPDATE tableA as a, tableB as b SET a.value = b.value WHERE a.id = b.id 上記のupdate文を流すと一行目の[as a]からsyntaxエラーが出ます。 ERROR 1064: You have an error in your SQL syntax near 'as a, tableB as b SET ~' at line 1 書き方が悪いのでしょうか? どのように記述すればb.valueをa.valueにsetできますか?

    • ベストアンサー
    • MySQL
  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

  • Update文について

    UPDATEについて SELECT * FROM A_table A JOIN B_table B ON (A.code = B.code) 上のように2つのテーブルをJOINして、 AのフィールドB.dateフィールドに A.dateフィールドを代入したいのですが、 どのようなUPDATE文を書けばよろしいでしょうか?

  • SQL文で他テーブルの件数も同時に求めたい

    SQL文について教えてください。(DBはSQLサーバー2000です。) 以下のように2つのテーブルがあります。Aテーブルのフィールド項目の抽出と、AテーブルのIDフィールドと同じ値のBテーブルの件数を同時に抽出したいのですが、どのように書いてよいか分かりません。恐れ入りますが、教えていただけないでしょうか? テーブルA  ID name Age -------------- 1  太郎 20 2  二郎 35 3 花子 26 テーブルB ID memo ------------------ 1  私は男です 1  東京に住んでます 2  友達が3人います 3 私は彼氏がいます 3  先日TDLに出かけました。 3  ランチはカレーでした。 要約すると、Aテーブルの全情報とテーブルBの件数を同時に抽出したいのです。以下のようなイメージです。 name Age テーブルB件数 ------------------- 太郎、20、 2 二郎、35、 1 花子、26、 3 よろしくお願い致します。

  • ACCESSの既存テーブルに、EXCELデータをレコードとして追加する事は可能ですか?

    ACCESSの既存テーブルに、EXCELのデータをレコードとして追加する方法はありますか? 又は方法を説明しているサイト等ありましたら教えて下さい。 EXCELのデータは、シートの1行目に各項目名、2行目以降に各データが順次入力されている状態です。 尚、EXCELの項目名と、ACCESSのフィールド名は一致していない状態です。 例えば、 EXCELの項目名:「予約ID」、「予約名」、「予約日」 ACCESSのフィールド名:「rsv_id」、「rsv_name」、「rsv_date」 のような感じです。 ACCESSのフィールド「rsv_id」には、EXCELの「予約ID」項目のデータを入れなければいけません。 こういうことは出来るのでしょうか? ※マクロは使わないようにしたいです。 いったんACCESS上で、EXCELのデータを元に新規テーブルを作成してから、 その新規テーブルからデータを抽出して、既存テーブルにレコード追加するような、SQLを書けばできるでしょうか?

  • UPDATE 同テーブル内のデータを移行したい

    同じテーブルの中にあるフィールドのデータをハイフンで結合して、 別のフィールドに登録したく思っています。 下記SQLを流すとエラーになります。 update TABLE1 T1 set T1.FIELD1 = T1.FIELD2 & '-' & T1.FIELD3 データベースはDB2です。 このようなやり方では出来ないのでしょうか? ご教授賜りたく。

  • SQLで複数のテーブルと結合したUPDATE文

    普通のUPDATE文はUPDATEするテーブル名を一つ記入して UPDATE テーブルA SET フィールドA = 値A WHERE テーブルA.フィールドB = 値B みたいな感じですが、私のしたい事はと言うと UPDATE テーブルA,テーブルB,テーブルC SET A.フィールドA = 値A WHERE テーブルA.フィールドA = テーブルB.フィールドB AND テーブルB.フィールドB = テーブルC.フィールドC AND テーブルB.フィールドD = 値D AND テーブルC.フィールドE = 値E という具合に複数のテーブルがUPDATEするテーブルA以外のところで、互いに条件で結ばれており、FROM句でUPDATEしないテーブル名まで宣言しないといけなくなっています。そもそもこういうFROM句を使うUPDATE文は実行可能かも不明です。どなたか解決策お願いいたします。ちなみに開発ソフトはVBAを使っています。

  • テーブルのどちらかにデータがない事があるテーブル結合について

    ■table a のテーブル構成 date a_id b_id c_id a_count ■table b のテーブル構成 date a_id b_id c_id b_count value 上記の2つのテーブル構成から、 ■date a_id b_id c_id毎の集計データ date a_id b_id c_id a_count b_count value を抽出するSQLが知りたいです。 table aにあって、table bに存在しない。又は逆もある為、 union しかないと思うのですが、思いつきません。。

    • ベストアンサー
    • MySQL
  • グループ化のSQL文について

    このジャンルでお願いします。 tbl id  starttime endtime val 1     0      40  3 2     160    170  1 3     160    190  2 starttimeとendtimeは「分(160なら60×2+40で2時40分になります)」で保存してます。 このようなテーブルで、時間毎にvalの平均を出したいのですが、 id  hour avg(val) 1    0   3  ← 0~1時まで 2    1   0  ← 1~2時まで 3    2   1.5  ← 2~3時まで 4    3   2  ← 3~4時まで ・ ・ 24   23   0  ← 23~24時まで といった感じで24区間に分けてその区間毎のvalの平均を出したいです。 これはどのようなSQL文になるのでしょうか? またこのようなSQL文で1度に取得するやり方と、 いったん全行取得してPHPなどでループして平均を計算するやり方とでは レコード数が増えてきた場合にどちらが速いとかはあるのでしょうか?

    • ベストアンサー
    • MySQL
  • Access2010で既存テーブルにインポート

    今、Access2003で、商品販売データ(CSV)をインポートし、店舗コード表テーブルとクエリで付け合わせし、販売店名付きの商品販売データをEXCEL形式でエクスポートするといった簡単な作業を行っています。 この商品販売データ(CSV)は販売した商品のデータの為、毎月フィールド構成が必ずしも一定しないという特長があります。 また、CSVの数も毎月30社分以上ありますが、一定しません。大方は毎月ありますが、一部は、あったりなっかたりします。 例えば ・A社の商品について9月には商品「イ・ロ・ハ」が全店舗で販売されましたが、、10月には「イ・ハ・ニ」だけ売られた。「ロ」は売れておらず、前月売れなかった「ニ」が売れました。 ・B社の商品について9月には商品「ト」を売りましたが、10月にはどの店舗でもB社の商品は販売されていない。 といった具合です。 Access2003でこれを行っていますが、やり方は以下のとおりです。 (1)今まで販売された会社の分だけテーブルおよび結合の為のクエリを前もって作成し。 (2)インポートウイザードで進んでいき最後の方で新規テーブルか既存テーブルか選択するところで「既存」を選択し、CSVに対応したテーブルを選択。 (3)フィールド構成が合ってればそのままインポートが完了する。 (4)フィールド構成が合ってなければ、ひとつ戻って「新規」に切り替え進んでいく。最後の方では(3)で選んだテーブル名が残ってるので、そのまま上書きで完了する。 (5)「(1)」で新たに会社が増えた場合は2・3カ月様子を見て継続してデータが発生するようならテーブルを作成。同時にクエリ等も作成 ・・・といった具合になります。 今度、会社のPC更改に伴い、Accessのバージョンが2010になるのですが、試してみたところ、2010はインポート先テーブルが「既存」か「新規」かを選択する部分が最初に来ます。 その為最後の方でフィールド構成が合わなかった場合、最初からやりなおしになり、既存のテーブル名を生かせす、入力しなおしになります。 今は、既存テーブル名を前もって覚えさせて、そこからコピペするくらいしか思いつかないのですが何かいい方法はありませんか? ご存知の方がいらっしゃいましたらよろしくお願いします。