人に聞けない痔の悩み、これでスッキリ >>

<環境>SQLSERVER

一時ワークテーブルのフィールドに指定した番号以降の連番を更新したいのですが、
クエリーで更新する方法はありますか?

例)
<更新前のテーブル>
コード 名前  連番 
001  AAA  null
002  BBB  null
003  CCC  null

<更新後のテーブル> 15以降の連番を更新する
コード 名前  連番 
001  AAA   15
002  BBB   16
003  CCC   17

このQ&Aに関連する最新のQ&A

A 回答 (2件)

SQLServer2005以降ならROW_NUMBERが使えます



---
UPDATE Table
SET 連番 = ROW_NUMBER() OVER(ORDER BY コード) + 14
FROM Table

参考URL:http://msdn.microsoft.com/ja-jp/library/ms186734(v=sql.90).aspx

この回答への補足

ROW_NUMBER() OVER(ORDER BY コード) + 14
で連番は取得できたのですが、
「ウィンドウ関数は、SELECT 句または ORDER BY 句だけで使用できます。」
とエラーが出ます。
これはどうすればよいのでしょうか?

補足日時:2011/06/28 09:29
    • good
    • 0

エラーどおりなので、Selectした結果とジョインして更新をかけます。


※この場合、コードが一意にならないと駄目です。

create table test
(
コード varchar(10),
名前 varchar(10),
連番 int
);

insert into test values('001','AAA',null);
insert into test values('002','BBB',null);
insert into test values('003','CCC',null);

select * from test;

UPDATE test
SET test.連番 = b.NewNo
FROM test
inner join (
select コード, (ROW_NUMBER() OVER(ORDER BY コード) + 14) as NewNo
FROM test) as b
on test.コード = b.コード
;

select * from test;

(1 行処理されました)

(1 行処理されました)

(1 行処理されました)
コード 名前 連番
---------- ---------- -----------
001 AAA NULL
002 BBB NULL
003 CCC NULL

(3 行処理されました)

(3 行処理されました)

コード 名前 連番
---------- ---------- -----------
001 AAA 15
002 BBB 16
003 CCC 17

(3 行処理されました)
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QINSERT時に発番を行いたい

ATBLからBTBLへのINSERT時発番を行いたい

<環境>
SQLSERVER 2008

<ATBL>
CDvarchar(3)KEY
NOintKEY
NAMEvarchar(10)

<BTBL>
CDvarchar(3)KEY
NOintKEY
NAMEvarchar(10)

<BTBLのデータ>
CD   NO  NAME
0011太郎
0013次郎
0015三郎

BTBLをATBLへINSERTしたいのですが、この時、NOを1から再付番したいのです。
INSERTクエリで一発で更新できますでしょうか?
ご教授お願いします。

Aベストアンサー

row_numberで1からの連番ふれるよ

INSERT INTO ATBL(CD, NO, NAME)
SELECT CD, row_number() OVER(ORDER BY CD) AS NO, NAME FROM BTBL

参考URL:http://msdn.microsoft.com/ja-jp/library/ms186734.aspx

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q自動連番でカラムを更新したい

いつもお世話になります。
あるテーブルのカラムに、「ある順番に並び替えた上で」自動連番をふって更新させたいのですが、上手くいきません。
当初はシーケンスを作成して試みたのですが、並び替えた上で連番をふることができず無作為な連番になってしまいました。
そこで、色々考えまして以下のように作成しましたが、、、
update tableA set colC = (select rownum from tableA order by colA, colB);
「ORA-00907:右カッコがありません」が出てきます。
文法が間違っておりますでしょうか??
それとも他に何か良い方法がありましたらご教授いただけますでしょうか?

Aベストアンサー

No.5です。
変数に値を入れただけになっているため、UPDATEしないといけないですね。以下のような感じになると思います。(コンパイル確認までできていませんのでご了承ください。)
この方法ですとあえてシーケンスをつかわなくてもよいかもですね。

declare
seq_no number := 1;
cursor cur1 is
select colA, colB, colC from tableA
order by colA, colB
-- ☆追加(カーソルをFOR UPDATE付きで宣言する)
FOR UPDATE;

begin
for cur_rec in cur1
loop

--☆変更(現在レコードにUPDATEをかける)
--cur_rec.colC := seq_no;
Update tableA set colC = seq_no where current of cur1;

seq_no := seq_no + 1;
end loop;
end;
/

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q特定条件での連番の振り方を教えて下さい

以下のようなテーブルがあります。

納品データ
注文番号 売上番号 連番 商品名
11111    2      1   さしすせそ
11111    2      2   たちつてと 
11111    3      1   なにぬねの
11111    4      1   はひふへほ

売上データ(既存データ)
注文番号 売上番号 連番 商品名
11111    1       1   あいうえお
11111    1       2   かきくけこ

注文番号は注文毎に付与される番号
売上番号は発送毎に付与される番号
連番は売上番号毎に付与される連番

毎回 納品データを売上データに取り込みます。

連番に関しては、
納品データと売上データで連番は連動しておらず、
売上データに納品データと同等の注文番号があれば、
注文番号の最大連番数を+1した番号で取り込みます。


更新後、売上データは、
注文番号 売上番号 連番 商品名
11111    1       1   あいうえお(既存データ)
11111    1       2   かきくけこ(既存データ)
11111    2       3   さしすせそ
11111    2       4   たちつてと
11111    4       5   なにぬねの
11111    5       6   はひふへほ

としたいのです。


SELECT
(SELECT 納品データ.連番+(SELECT NVL(MAX(売上データ.連番),0) FROM 売上データ
WHERE 売上データ.注文番号 = 納品データ.注文番号) AS 連番)
FROM 納品データ

で売上データの連番+1はできたのですが、
売上番号が違う場合は、連番が1になるパターンとなり、

納品データ
注文番号 売上番号 連番 商品名
11111    2       1   さしすせそ
11111    2       2   たちつてと 
11111    3       1   なにぬねの ←
11111    4       1   はひふへほ ←

上記SQLですと、
更新後、売上データは、

注文番号 売上番号 連番 商品名
11111    1       1   あいうえお(既存データ)
11111    1       2   かきくけこ(既存データ)
11111    2       3   さしすせそ
11111    2       4   たちつてと
11111    4       3   なにぬねの ← 5にしたい
11111    5       3   はひふへほ ← 6にしたい

となり、連番となりません。

どのようにSQLを書けばよいのか、困っています。
どうか、ご教示お願い致します。

以下のようなテーブルがあります。

納品データ
注文番号 売上番号 連番 商品名
11111    2      1   さしすせそ
11111    2      2   たちつてと 
11111    3      1   なにぬねの
11111    4      1   はひふへほ

売上データ(既存データ)
注文番号 売上番号 連番 商品名
11111    1       1   あいうえお
11111    1       2   かきくけこ

注文番号は注文毎に付与される番号
売上番号は発送毎に付与される番号
連番は売上番号毎に...続きを読む

Aベストアンサー

こういうことでしょうか。

insert into 売上データ (
注文番号, 売上番号, 連番, 商品名
)
select
注文番号
, 売上番号
, ROW_NUMBER() over(partition by 注文番号 order by 売上番号, 連番) + (select COUNT(*) from 売上データ T2 where T1.注文番号 = T2.注文番号) 連番
, 商品名
from 納品データ t1;

ROW_NUMBER()で納品データ内での連番を振って、その連番に既存データの件数を足しています。
MAX(連番)だと、同一注文番号が既存データに存在しない時にNULLになってしまうので、COUNTで件数を取るようにしています。

QINSERT時にデータ登録と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 & "')

宜しくお願いいたします。

Aベストアンサー

INSERT INTO テーブル1(依頼No, 依頼日)
SELECT MAX(依頼No)+100, '2013/05/13' FROM テーブル1

Q型 varchar から型 numeric への変換エラー。

SQLクエリアナライザを使って、あるデータベースからLEFT JOINなどを駆使し、条件にそってデータを抽出しようと必死でやっております。
今まではうまく取得できていたのに、”型 varchar から型 numeric への変換エラー。”というエラーがでるようになりました。
前回とテーブルのデータを比較してみると、IsNULL(chrShokuhinCD,'') as chrShokuhinCDで引っ掛かっているようです。
この項目には空白(スペース)が入ったデータが最近存在しているのが原因だと思うのですが。。。
空白だったとき、IsNULL(chrShokuhinCD,'') as chrShokuhinCDはどのように修正すればよいでしょうか?教えてください。

Aベストアンサー

>空白だったとき、IsNULL(chrShokuhinCD,'') as chrShokuhinCDはどのように修正すればよいでしょうか?

では質問です。
空白だったとき、どんな数値として扱えばいいでしょうか?

これで何を入れればいいかわかると思いますが。

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む

QEXISTSを使ったDELETE文

「SELECT文の件数」と、
「同じSELECT文を使ったDELETE文の件数」が一致しない現象が起き、困っています。

【SELECT文】※2件返ってきます。
SELECT
  a.部署コード,
  a.社員コード
FROM
  社員マスタ a,
  組織マスタ b
WHERE
  a.部署コード = b.部署コード


【DELETE文】※50件 DELETEされます。
DELETE TABLE
  社員マスタ
WHERE
  EXISTS
  (
  SELECT
    a.部署コード,
    a.社員コード
  FROM
    社員マスタ a,
    組織マスタ b
  WHERE
    a.部署コード = b.部署コード
  )


環境はSQLSERVER2005です。
件数はSQLSERVER2005のカウントオプションで表示されているものなので間違いないです。

宜しくお願いします。

Aベストアンサー

EXISTS 句は、副問い合わせが行を返した場合 TRUE そうでない場合 FALSE と評価されます。

例示いただいた副問い合わせは TRUE を返すので DELETE されます。

詳細については、SQLの入門書を参考にしてください。

Q文字列をsplitするSQL文を教えて下さい

SQLServer2000上で指定した文字で文字列をsplitような関数があれば教えて頂けますか?

例えば"12345.6789"という文字列を"."(ピリオド)を指定して、"12345"と"6789"という2つの文字列を取得したいと思っています。

Transact-SQLの関数リファレンスを見てみたのですが、適当なものが見つかりませんでした。
自作するしかないのでしょうか・・

Aベストアンサー

見当たりませんね~。

declare @str1 nvarchar(1),@str2 nvarchar(50)
select @str1 =N'.',@str2 = N'12345.6789'
select
substring(@str2,1,charindex(@str1,@str2)-1) as 前,
substring(@str2,charindex(@str1,@str2)+1,len(@str2)-charindex(@str1,@str2)) as 後

こんな感じにしかできないみたいです


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング