• 締切済み

Transact-SQLで順番に日付をセットするには?

主キーが存在しないうえに、まったく同じデータが1万件件あります。 そのデータに対して日付項目だけ 2009/1/1、2009/1/2...といった感じで順番にUPDATEをかけたいのですが Transact-SQLで実装するにはどうすればいいでしょうか?

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

#1です。やったことはなかったんですけど、SQL Server 2005以降であれば、以下の方法でもやれますね。 UPDATE t SET DATE=DATEADD(d,t.SEQ,'2008/12/31') FROM (SELECT ROW_NUMBER() OVER (ORDER BY DATE) SEQ,* FROM TABLE1) t

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

主キーがなく、全く同じデータということは1行毎に更新を掛けることができないということです。 従って、以下のいずれかの方法で一時的にユニークになるキーを設ける必要があります。 1)そのテーブルに一時的に連番を振る 2)一時テーブルを使って加工し、最後にテーブルの中身を入れ替える それぞれのサンプルは以下の通りです。 後者の場合は、そのテーブルに外部キーが設定されていないことを前提に書いています。 1) ALTER TABLE TABLE1 ADD [SEQ][int] IDENTITY UPDATE TABLE1 SET DATE=DATEADD(d,SEQ,'2008/12/31') ALTER TABLE TABLE1 DROP COLUMN [SEQ] 2) SELECT * INTO #WORK FROM TABLE1 ALTER TABLE #WORK ADD [SEQ][int] IDENTITY UPDATE #WORK SET DATE=DATEADD(d,SEQ,'2008/12/31') ALTER TABLE #WORK DROP COLUMN [SEQ] ------------------------ここまでやって一度結果を確認した方がベター TRUNCATE TABLE TABLE1 INSERT INTO TABLE1 SELECT * FROM #WORK DROP TABLE #WORK

p02acx
質問者

補足

回答ありがとうございます T-SQLだとPGを組むようにはいかないようですね 書いて頂いたサンプルで試してみますー 結果が出たらお礼の方に書きますね

関連するQ&A

  • SQL文にて

    調べたり聞いたりしたのですが なかなか解らなかったので、質問させてください。 AテーブルとBテーブルとがあり、Aテーブルのみにしか 存在しないデータを一発で取得することはできるのでしょうか? Aテーブルのデータ数(100件) Bテーブルのデータ数(80件) Aのキー項目とBのキー項目とは同一です。 処理をしたい事はAとBとでAにしか存在しないデータを ループせずに一回のSQLで行えたらと思っています。

  • ビュー(view)のSQL

    SQL初心者で困っております。 どのようなSQLを作成すれば良いか ご助言頂ける方がいらっしゃいましたら よろしくお願いいたします。 テーブルにイメージは以下通りです。 項目1,日付,月,項目2,項目3 1234 ,6/2 ,6 ,A ,1 1234 ,6/4 ,6 ,A ,2 1234 ,6/5 ,6 ,A ,3 1234 ,6/6 ,6 ,B ,1 1234 ,6/6 ,6 ,B ,2 1234 ,6/6 ,6 ,B ,3 1234 ,7/2 ,7 ,A ,1 1234 ,7/4 ,7 ,A ,2 主キーは、項目1,日付です。 ビューで項目1,月をグループ化して、 項目2の昇順のトップ その中で項目3の昇順のトップ のレコードを抽出したいと思います。 結果が以下のようなイメージです。 1234,6,A,1 1234,7,A,1

  • SQL UPDATE 文 GroupByの値を更新したい

    SQLの UPDATE文について質問させていただきます。 テーブル内のデータを日付と時間で GroupBy して カウント求めています。 求めた値(カウント)を、日付をキーにして同じテーブル内のフィールドに更新するSQLを作成したいと考えています。 GroupByして、カウントを求めることはできるのですが、 どうしても、UPDATE文を実行させることができません。 この処理は、SQLで行うことはできるのでしょうか? 下記に、UPDATE前と後のテーブルデータを記載しています。 日付   時刻 20090101 0:00  20090101 0:00 20090102 0:00 20090102 0:00 20090102 1:00 20090103 2:00 ↓ 日付   時刻 カウント 20090101 0:00 2 20090101 0:00 2 20090102 0:00 2 20090102 0:00 2 20090102 1:00 1 20090103 2:00 1 よろしくお願いいたします。

  • [ACCESS97]SQLの書き方

    グラフのレコードソースにクエリ・SQLを使用しています。データ入力チェックに使おうと思っています。妙なデータがはいった場合、グラフが乱れるのではないかと。 ソートは日付でしています。 それで、100レコードずつを順番に表示していきたいのですが、top値 だと最初からいくつ、、としか指定できません。これを、レコードの途中の任意の位置から取るにはどうしたらいいのでしょうか? IDとかのようにユニークな値でソートしているのであれば、大小関係で一発ですが、同じ値がいくつも存在する日付なもので困っています。 日付でソートしたものを配列に入れる、もしくは一度テーブルに書き出す等も考えているのですが、SQLでできたら助かります。 よろしくお願いします。

  • SQLで取得可能でしょうか

    SQLで取得可能でしょうか 今2つのテーブルがあるとします。 ---------------------- テーブル1  KEY    項目   1   テスト1   2   テスト2   3   テスト3 ----------------------- ---------------------- テーブル2   CD  名称    1   か   1   き   2   さ   2   し   2   す   3   た ----------------------- テーブル1のKEYはキーで重複しません。 テーブル2のCDは重複しますが、内容はテーブル1のKEYとリンクします。 今、テーブル1のKEY1件につき、データを1件取得したいのですが、 テーブル2の名称も取得したいです。 データは1件しか取得しない為、名称は、特定文字(例として/)で 区切って取得したいです。 期待したい結果 ----------------------  KEY  名称   1  か/き   2  さ/し/す   3  た ---------------------- このような取得は可能でしょうか? 尚、SQLの発行は1回のみで行いたいです。 よろしくお願いします。

  • 【sql】DUPLICATE KEY UPについて

    mysql で  ON DUPLICATE KEY UPDATE  といれると、 すでに同じプライマリキーのデータが存在した場合アップデートとして 扱われますが、プライマリキーが同じであり、かつ プラス条件を 課すことはできないのでしょうか? たとえば、プライマリキーが 5のデータを更新すると すでに、5のデータが存在した場合はアップデートとして扱われるが ただし、ある条件(日付が◯◯日以下等)に反する場合は アップデートも行われない。 というような処理です。

    • ベストアンサー
    • MySQL
  • 日付時刻+連番の主キーをSQLだけで作りたい

    前提:ORACLE 「一番古いレコードを取得する。」というのが条件です。 これを満たすだけであればSEQENCE等で連番を振れば満たせます。 しかし、日付時刻+連番であればカラム一つで時刻まで把握できます。 (日付時刻を利用することはありませんが、付加価値?として。) というわけで、日付時刻+連番(桁固定のサイクリック)の主キーを使いたいのですが、 以下のように同時刻で連番が先頭に戻ると順番が守れません。 時刻A9999 時刻A0000 ← あとから挿入したのに同時刻の先頭になる プログラムであれば同時刻なら連番を先頭から使うことも簡単ですが、 このよなことをSQL側だけでできるのでしょうか? よろしくお願いします。

  • 日付範囲を展開したレコードを作成したい

    Oracleでストアドパッケージを作っています。 key1 key2 key3 sdate   edate 1   1   1   2012/07/12 2012/09/11 2   2   2   2012/06/01 2012/07/31 こんなデータがあった時、以下のように日付の範囲を展開した レコード群を得たいのですが、やり方が思いつきません。 key1 key2 key3 date 1   1   1   2012/07/01 1   1   1   2012/08/01 1   1   1   2012/09/01 2   2   2   2012/06/01 2   2   2   2012/07/01 事情により、Typeは使えません。 展開後、別途SQLで利用するつもりです。 ストアド内だけで実装可能でしょうか?

  • “SQL文を作るSQL”の書き方ってありますか?

    “SQL文を作るSQL”の書き方ってあるのでしょうか? 例えばなのですが、表同士を大量に結合して条件に当てはまったものをアップデートするようなSQLを書く場合、文法を間違うとエライこちゃ!になる場合がありますよね。 そういう場合って結合するんじゃなくて結合したSELECT文を使って条件だしをして1件1件単純アップデートをした方が安心ですよね。 (定期処理であれば効率が悪いですが・・・だったらプロシージャですか・・・というところになりますがごくたまにや1回きりのデータ変更など) そういったことをやるほうほうはありますでしょうか? 仕様はSQL99です。

  • SQL*Loaderでのゼロ埋め

    SQL*Loaderでデータを取り込む際に、対象データの左桁をゼロ埋めにする方法を教えてください。 例えば、取り込み対象の項目が、5桁未満の場合はゼロ埋めを行う。 ・取り込み対象:111 ・ゼロ埋め後の結果:00111(この値を取り込む) 上記を実装する方法が分からず困っております。 SQL*Loaderは初めて使用するため、調べる方法も見つけられませんでした。 何か良い方法がありましたら、お教え願えないでしょうか。 また、上記を実装するための参考になるサイト等を教えていただけないでしょうか。 よろしく御願い致します。