既存テーブルから別テーブルへのデータコピー時、発番を行いたい

このQ&Aのポイント
  • 既存のテーブルから別のテーブルへデータをコピーする際に、データの発番を行いたい場合について教えてください。
  • データを一括で移行する際に、主キーの重複エラーが発生してしまいます。この問題を解決する方法について教えてください。
  • insert文を使用して、売上テーブルのデータに新しい売上NOを作成して追加しようとしましたが、うまくいきません。問題を解決するための方法を教えてください。
回答を見る
  • ベストアンサー

既存テーブルから別テーブルへのデータコピー時、発番を行いたい

お世話になります。 テーブルからテーブルへのデータコピーをしたいのです。 たとえば、 ワークテーブルから売上テーブルへ データをコピーするとします。 売上テーブルには、主キーとなる「売上NO」(10桁)という項目があります。 ワークテーブルには売上NOはないので、データ移行時に売上NOを作成してやらないといけません。 一文だけで片付けようとすればどう書けば良いのでしょう?というか一文では無理なのでしょうか? insert into 売上テーブル (売上NO,販売単価......) select (select right('0000000000' + (convert(nvarchar,max(売上NO) + 1)),10) from 売上テーブル) ,販売単価..... from ワークテーブル とやってみましたが、ダメでした。一括でデータ追加に行くので主キー重複エラーとなりました。 どなたかご教授ください。お願いします。

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

  • ベストアンサー
noname#182251
noname#182251
回答No.3

現在SQL Serverで試験できないので、AccessでテストしたSQL文です。テーブルは単純化し ・売上テーブル 売上NO:Pkey 品名 販売単価 ・ワークテーブル id:Pkey 品名 販売単価 です。 まず一次試験として SELECT (SELECT COUNT(*)+1 FROM ワークテーブル WHERE (ワークテーブル.品名<S.品名) OR ((ワークテーブル.品名=S.品名) AND (ワークテーブル.id>S.id))) AS [No], S.品名, S.販売単価 FROM ワークテーブル AS S ORDER BY S.品名; このSQL文はいかがでしょうか?品名順に連番が振られるようであれば INSERT INTO 売上テーブル ( 売上NO, 品名, 販売単価 ) SELECT (SELECT COUNT(*)+1 FROM ワークテーブル WHERE (ワークテーブル.品名<S.品名) OR ((ワークテーブル.品名=S.品名) AND (ワークテーブル.id>S.id))) AS [No], S.品名, S.販売単価 FROM ワークテーブル AS S; これで売り上げテーブルに「主キー重複エラー」なしにINSERT出来ます。 勿論、最終的にお望みのものにするためには right('0000000000' + (convert(nvarchar,max(売上NO) ここら辺の処理が必要なわけですが。 蛇足かもしれませんが、ワークテーブルに id を置いたのはともかく重複しない Pkey が必要だからで、それがないと連番が崩れます。

sabo-ten
質問者

お礼

テストで動かしてみました。 いずれにしてもワークテーブルにidは必要になりそうですね。 応用してなんとか出来そうです。やってみます。 ありがとうございました。

その他の回答 (2)

noname#182251
noname#182251
回答No.2

#1です。カテゴリーがSQL Serverでしたね。失礼しました。

sabo-ten
質問者

補足

入れ違いで補足書き込みしてました。私のほうも失礼しました…。

noname#182251
noname#182251
回答No.1

データベースなど環境が全く記載されていませんが? 売上テーブルの、主キーとなる「売上NO」をオートナンバー型にしては拙いのでしょうか。 もし支障があるならばサブクエリーを使用する方法がありそうです。

sabo-ten
質問者

補足

SqlServerです。SqlServer2000。 手動によるデータコピーであり、 アプリケーションとして動作を実現させようとしているわけではありません。 今のところ、クエリアナライザから実行しようとしています。 売上テーブル[売上NO]をオートナンバー型にすることは出来ません。

関連するQ&A

  • INSERT時にデータ登録とmaxの発番がしたい

    <環境> SQLSERVER 2012 入力フォームに、入力した後で、DBに登録した際に、 依頼Noに、既にあるデータのMAX+100の値を登録したいです。 依頼NoにMAX+100の連番をふることは以下の方法でできたのですが、 INSERT INTO テーブル1(依頼No) SELECT MAX(依頼No)+100 AS NEW_ID FROM テーブル1 入力フォームのデータと登録と同時に、依頼Noを振りたいのですができません。 以下のように書いてみましたが、 根本的に間違っていると思うので、いい方法をご教授いただけたらと思います。 ※iraibi は入力フォームで、依頼日を入力した値です。 INSERT INTO テーブル1 (依頼No,依頼日) VALUES ('SELECT MAX(依頼書No)+100 AS NEW_ID FROM テーブル1','" & iraibi & "') 宜しくお願いいたします。

  • SELCTを使って違うテーブルのデータを2度使って表示させたいのですが

    SELCTを使って違うテーブルのデータを2度使って表示させたいのですが どのようにしたらいいのか教えてください。 ---------------------- ■テーブルの構成 ・FoodList NO(主キー) Food ・MyList NO(主キー) fist second ---------------------- ■テーブルの内容 ・FoodList NO Food 1 りんご 2 みかん 3 ぶどう ・MyList NO fist second 1 2 3 2 1 2 3 2 1 ---------------------- これで 1 みかん ぶどう 2 りんご みかん 3 みかん りんご というように表示させたいのですが どのようにしたらいいのでしょうか? --------------------------------------------------------- SELECT MyLike.NO AS Expr1,FoodList.food,MyLike.Second FROM FoodList INNER JOIN MyLike ON FoodList.NO = MyLike.first --------------------------------------------------------- とすると 1 みかん 3 2 りんご 2 3 みかん 1 となってしまいますし --------------------------------------------------------- SELECT MyLike.NO AS Expr1,FoodList.food,MyLike.Second FROM FoodList INNER JOIN MyLike ON FoodList.NO = MyLike.first AND FoodList.NO=MyLike.Second --------------------------------------------------------- とすると表示されないですし どのようにしたら実現できるでしょうか? 教えてください。よろしくお願いします。

  • 別テーブルを参照し、その内容を別のテーブルに書き込む

    2つのテーブルに存在しているデータを参照し、 取得したデータの結果を3つ目のテーブルに保存する処理をしているのですが // USERのUNIQUEとGAMEのGAME_NOはプライマリーキー select RATE from USER where UNIQUE = xxx select POINT from GAME where GAME_NO = yyy insert into HISTORY set COIN = RATE * POINT 今は一つの保存に対して3つのSQL文を使わなければいけないのですが、 うまいことこの3つのSQL文を一つか二つにつなげるということは出来ないものでしょうか?

    • ベストアンサー
    • MySQL
  • select文で int を yyyy-mm-dd に変換したい

    つまり「20040102」のデータを「2004-01-02」という文字型に変換したいのですが? select substring(convert(nvarchar, f1, 1,4) + '-' + substring(convert(nvarchar, f1, 5,2) + '-' + substring(convert(nvarchar, f1, 7,2) from tbl1 だと一応変換はしてくれるのですが,面倒なのが「0」というデータがある場合 '0--'というふうに出てきてしまうのです int → char 20041123 → '2004-11-23' 0 → '' '' → '' という形に変換できないでしょうか?

  • テーブル属性変更後のデータ移動

    あるテーブルのキー項目をnumberからvarchar2に変更します。 テーブルの全件を仮テーブルを作成してコピー 元テーブルをTRUNCATE後、型変換 仮テーブルのデータを元テーブルへコピー という流れで、それぞれSQL文はできましたが、 仮テーブルのデータを元テーブルへコピーを実現する SQLが思い浮かびません。 insert into AAA select * from BBBだと、属性もコピーされてしまう? とのことで、ご教授お願いいたします。

  • Accessのテーブルへのデータインポートについて

    Accessのテーブルへのデータインポートについて Access2002で、A.mdbのTESTテーブルからB.mdbのTESTテーブル(構造は同じ)へテーブルデータをインポートしたいのです。 TESTテーブルの主キーはSEQ(オートナンバー)しかありません。 そのときに、コピー元とコピー先の主キーに重複があった場合、オートナンバーなので自動で再付番しデータが追加して欲しかったのですが、 Accessの機能のエクスポート、インポートでは、コピー先に主キーに重複があったデータは上書きされてしまいます。 テーブルを開き、データをコピー&ペーストしますと、ペーストしたときにオートナンバーで自動で再付番されます。 この方法でもいいのですが、データが数百万件あるので、現実的ではありません。 Accessのインポート・エクスポートで、オートナンバーで主キーを再付番してから、B.mdbのTESTテーブルにデータ追加する方法はないでしょうか? よろしくお願いいたします。

  • PostgreSQLで、元テーブルをコピーする時に制約も取得するには?

    PostgreSQLの質問です。 元テーブルを新規テーブルに項目だけコピーしたいのですが、 primary key などの制約も同時にコピーする方法を教えて頂けないでしょうか? 下記で、空のテーブルをコピーできると思ったのですが、これでは制約はコピーされないようです。 CREATE TABLE tableName_temp AS SELECT * FROM tableName WHERE 1 = 0 また、後付で制約をつけるにも、CREATE TABLE時にしかつけることができないみたいです。 何かよい方法がありましたら、宜しくお願い致します。

  • テーブル作成クエリで新テーブル作成時に、オートナン

    SELECT Q_ユニオンクエリ.* INTO 新テーブル FROM Q_ユニオンクエリ; テーブル作成クエリで、新テーブルを作成するときに、 元テーブルにはないフィールドを作成することは可能ですか? 元テーブルには主キーがなく、 カテゴリ、品名 というフィールドしかない場合、 テーブル作成クエリで新テーブル作成時に、オートナンバー型の主キーを付ける方法はありますか?

  • SQLServer2000でデータ数が10万くらいあるテーブルから、

    SQLServer2000でデータ数が10万くらいあるテーブルから、 OrderByやTopなどのSQL文を使用すると、 SELECTに数秒かかってしまいます。 該当のカラムを主キーにはできないですが、 インデックス化?みたいなことをして、 SELECTを短時間化できないでしょうか?

  • 別のDBからテーブルをコピーする方法

    SQL Server2005 Express Edition を使っています。 異なるDB間(同じコンピュータ内)で、テーブルをコピーしたいの ですが・・・ コピー元DB名:DB_A コピー元テーブル名:dbo.顧客 コピー先DB名:DB_B テーブルのコピーは select * into ・・・ from ・・・ を使えばできそうですが、別DBの場合の方法がわかりません。 お教えいただければ幸いです。 よろしくお願いいたします。