• ベストアンサー

SQL文で、重複データの上書きはできますか

一定範囲(複数)のデータを追加したい場合、 追加する時に、既に既存のデータがある場合は、 データを上書きし、無い時は、データを新規追加 する、ということをやりたいのですが、SQL文で、 そのような命令はあるでしょうか。 Excelで打ち込んだ、数件のデータを、データベース 用の別のExcelシートに一気に保存したい時に、 この問題が生じてしまいます。 (INSERT命令のみだと、すべて新規となるので、 重複データができてしまい、何が新規でなにが新規 でないかをいちいち区別し、処理を分けるのも 困難です)。 非常に初歩的かもしれませんが、お願いします(ちなみに、ExcelVBAで、SQLを使おうと思っています)。

noname#10667
noname#10667

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>何が新規でなにが新規でないかをいちいち区別し、処理を分ける 処理を分けるのはやらないとしょうがないです。 とりあえず、 UPDATEでやってみて エラーになったら INSERTするというのはどうでしょうか

その他の回答 (2)

回答No.3

主キーが存在するのであれば(重複と言っているわけですから当然あるはずです)、まず主キーで元のテーブルの一致するレコードを全て消します。 その後、Insertすれば問題ありません。 例) Delete From Table_org Where 主キー in (Select 主キー From Table_App) Insert Into Table_org Select * From Table_App

noname#10667
質問者

お礼

いろいろ回答ありがとうございました。 回答を見た限り、一発でこのような処理をするのは 無理そうですね。 処理を分けてやってみます。

回答No.2

一発での処理(SQL文)はできないでしょうね。 >何が新規でなにが新規でないかをいちいち区別し、処理を分けるのも困難です 処理ロジックとしては・・・ 追加データの主キーで検索 →ヒットしたら、ヒットしたレコードを削除し、追加データをINSERTする。 →ヒットしなかったら、そのまま追加データをINSERTする。 で、どうでしょうか?

関連するQ&A

  • 重複レコードの上書きについて

    重複レコードを上書きするSQL構文についての質問です。 SELECT文で更新対象のレコードが、 すでに存在しているかをどうかを確認にしてから、 UPDATE文を発行して更新する方法と、 DELETE文を発行して更新対象のレコードを削除した後に INSERT文で更新文のデータを追加する方法があるのですが、 処理的にはどちらが早くなるのものなんでしょうか?

  • データベースを使用して、SQLのデータを上書き

    データベースを使用して、SQLのデータを上書きしたいのですが、 『m_control』テーブルの「controlid」にある同名データ('PRIMARY')があるため、エラーになります。 どうしたら上書きできるのか、対応方法を教えてください。

  • SQL*Loader Append

    SQL*Loaderのコントロールファイル内のパラメータ設定についてですが、 ネットで調べた結果 ロード方法をAPPENDとすると既存データがある場合は新しい行として追加とあるのですが、 これはテーブルのPKが重複していても新しく行がついかされるということでしょうか? 逆にREPLACEはPKが重複しているデータに上書きされるということでしょうか? よろしくお願いいたします。

  • 時間範囲が重複したレコードを返すSQL

    PostgreSQL(データベース)の カラムに指定した時間範囲が存在する場合、エラーとし 存在しない場合、INSERTしたいのですが、 どのようなSQLを書けば良いでしょうか? ◆カラム内容 開始時間 終了時間 12:00   14:00 14:00   19:00 という2つのレコードが格納されていた場合に、 以下のSELECT→INSERTという流れで考えています。 19:00から19:05はOKで、INSERT処理を行う 18:55から19:05はNGで、重複したレコードを返す 10:00から12:00はOKで、INSERT処理を行う 10:00から12:05はNGで、重複したレコードを返す

  • 重複データをカウントするのに便利なSQL文

    phpで検索結果画面の制作を勉強中です。 pdoでmysqlデータベースに接続しています。 添付画像のように、 重複しているデータをひとつにまとめ、それぞれの重複数を取得するようなSQL文はないでしょうか? ちなみにできれば、添付画像のように、 フォームで入力されたテキストをもとに、 WHERE文でカラム名をあいまい検索をした上で 該当する重複レコードのカラム名を1つだけ表示し、その横に重複数を表示したいです。 フォームのテキストをもとにあいまい検索をする方法は理解しておりますので、 該当する重複レコードのカラム名を1つだけを取得し、その重複数も取得できるようなSQL文があれば教えていただきたいです。 色々と試しては見たのですが、中々上手くいかずに悩んでいます。 ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 重複データを除外するSQL文の作成について 

    (1)CATEGORYで、重複したレコードを除いてユニークにしたい (2)重複の比較をする際に、大文字・小文字は区別をせずに比較したい (3)また、前後にスペースが含まれているときはスペースを除いた状態で比較したい (4)重複しているデータは、CREATE_DATEが新しいものを採用したい (5)前後にスペースがある場合は、スペースを削除して出力する SQLを考えてみましたが、(1)と(4)はOKだと思うのですが、それ以外の条件について LOWERとTRIMを使う事になるかと思いますが、SQL文のどこに追加すれば意図した結果 となるのかが分からない状況です。 ------------------------------------------------------- SELECT A.ID, A.CATEGORY, A.CREATE_DATE FROM PRODUCT_LIST A, (SELECT CATEGORY, MAX(CREATE_DATE) as CREATE_DATE FROM PRODUCT_LIST GROUP BY CATEGORY) B WHERE A.CATEGORY = B.CATEGORY AND A.CREATE_DATE = B.CREATE_DATE ------------------------------------------------------- =============================== ■ 元データ ID CATEGORY CREATE_DATE =============================== 1   aaa   01/01 2   bbb   01/01 3   ccc   01/01 4   ddd   01/01 5   aaa   02/01 6   _bbb   02/01 7   CCC   02/01 =============================== =============================== ■ 希望するデータ ID CATEGORY CREATE_DATE =============================== 4   ddd   01/01 5   aaa   02/01 6   bbb   02/01 7   CCC   02/01 =============================== (※ スペースをアンダーバーで示しています) よろしくお願いいたします。 (環境はOracle9iです)

  • AccessのSQLについて教えてください。

    Excel+VBA から、ADOを使って、Accessを操作しようとしています。 なんとか、sqlを実行できるようになったのですが、 一点、分からないところが出てきましたので、教えてください。 insert文で、レコードを追加したとき、追加されたレコードのIDを取得したいのですが、 どのようにすれば良いかわかりません。 コードは次のようにしています。 cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & データベース名 & ";" sql = "INSERT INTO テーブル名(フィールド) VALUES(値)" cnn.Execute sql 以上、すみませんが、よろしくお願いいたします。

  • MySQLのINSERT時にたまに重複になる

    下記の通り同じデータが無かった場合に限りインサートしています。 //同じデータが既にあるか確認 $sql = "select * from `reg_data` where "; $sql .= "`Date` = '".$date."' and "; $sql .= "`ID` = '".$id."' and "; $sql .= "`No` = '".$no."'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); //データが0なら今日のレコード作成 if($rows == 0){ $sql = "insert into `reg_data` values('0', '".$date."', '".$id."', '".$no.")"; mysql_query($sql); } しかし、3%ぐらいの確立で重複インサートになってしまいます。 重複といっても 1個目のフィールドはAUTO_INCREMENTになっておりまして AUTO_INCREMENTの値が重複する事は無いです。 $date、$id、$noがまったく同じテーブルがいくつか重複した場合でも AUTO_INCREMENTの値は全て連番になっています。 重複インサートが発生しないよう改善するには どうしたら良いでしょうか。 日付を2フィールド目に書いているので 0時0分1秒辺りでインサートが集中してしまいます。 分散させられたら改善するような気がしますが いい案が思いつきません。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • formデータの受け渡しの際の重複確認について。

    質問をごらんくださりありがとうございます。 会員番号と名前を既存のデータベースに新規追加したいと思っています。 その際に、会員番号が既存の会員番号と重複する場合、エラーメッセージが表示されるうようなものをphpで書きたいと思っています。 重複しているか調べるのは会員番号のみで、名前は重複してもかまいません。 どんな風に書けばいいか教えていただけると嬉しいです。

    • ベストアンサー
    • PHP
  • SQL (insert文)文の質問です。

    すみません、緊急で調べる時間があまりなくてお尋ねします。 次のDBが2つあります。 データベース名:A_DATA 内容  名前     番号     登録年月日 これには既にデータが投入されています。 そして データベース名:B_DATA 内容  名前     番号     住所     電話     国籍 とあった場合B_DATAにinsertを行うのですが、 その際のデータの内容はA_DATAの内容を検索してその 値を投入したいのです。 A_DATAの検索条件は登録年月日が本日のもので B_DATAの名前と番号の値は 名前=A_DATAの名前 番号=A_DATAの番号 でINSERTしたいのです。 意味がわかりますでしょうか? 多量にデータがあるのでなんとかうまいSQLを考えてるのですが、あまり詳しくないもので。。。 すみません誰かよろしくお願いします。