質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

16205閲覧

【SQL】対象データの最初の1件だけUPDATEしたい

K_aito0122

総合スコア8

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/03/19 05:24

前提・実現したいこと

以下のようなテーブルがあったときに最初の行だけの金額を伝票NOのみをWhere句に使って変更したいです。

明細テーブル

伝票NO金額列3
000013,000
000012,000
000011,000

該当のソースコード

以下のような書き方をしてしまうと全件の金額が、6000円に書き換わってしまうため困っています。

UPDATE 明細 SET 金額 = 6000 WHERE ID = '00001'

補足情報(FW/ツールのバージョンなど)

SQL Server Management Studio 2017

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/03/19 05:32

Window関数使ってもUPDATEする行の特定を「伝票NOのみ」という条件にされてしまっては、論理的に無理でしょう。
sazi

2020/03/19 05:36 編集

表示が最初の行などという条件は常に保証されるものでは無いので無理です。 そもそも、最初の行に意味があるのですか? 金額訂正なら他の行でも可能性はあるでしょうし。
gentaro

2020/03/19 05:36

あー、辛うじてRowNumberとCASEを使えばできるかもしれないけど…ちょっとそこまでやる意味は感じないからいいや。
kaina

2020/03/19 05:45

何故最初の行のみ更新したいのか理由を追記して下さい。 そうすれば、識者から別の方法が出るかもしれません。
m.ts10806

2020/03/19 06:05

何かしらで一意にするためのカラムは必要です。無理くりやろうとしても労力のわりには効果でないのでは。 テーブル定義と編集方針を見直すのが最も確実です。
guest

回答3

0

ベストアンサー

SQL Server触ったことがなく、
調べた内容の引用だけで大変恐縮なのですが、、
他のRDBにはないTOP句というものがあるそうです。

sql

1UPDATE TOP (1) 明細 2SET 金額 = 6000 3WHERE ID = '00001'

みなさんがご指摘の通り、そもそも行の順番も担保されておらず、
キーが存在しないのは後々問題になるはずなので、
もしもDB設計について変更する権限があるのであれば、再考されると良いかと思います。

ご参考:
https://stackoverflow.com/questions/1198364/how-can-i-update-top-100-records-in-sql-server

投稿2020/03/19 05:56

kokemomo.sour

総合スコア330

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

カーソル使うとか。

SQL

1DECLARE CUR CURSOR FOR SELECT 伝票NO, 金額 FROM 明細; 2DECLARE @伝票NO VARCHAR(10); 3DECLARE @金額 DECIMAL; 4OPEN CUR; 5FETCH NEXT FROM CUR INTO @伝票NO,@金額; 6IF @@FETCH_STATUS = 0 7 UPDATE 明細 SET 金額 = 6000 WHERE CURRENT OF CUR; 8CLOSE CUR; 9DEALLOCATE CUR;

型は不明なので適当です。

投稿2020/03/19 05:53

編集2020/03/19 05:56
KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

主キーや一意キーの類がないのが一番アレですが、目的のことをやりたいなら

SQL

1UPDATE 明細 2SET 金額 = 6000 3WHERE ID = '00001' AND 金額 = 3000

で良いんじゃないですか。


追記
ちょっと読み落としてた

最初の行だけの金額を伝票NOのみをWhere句に使って変更したいです。

無理です。

投稿2020/03/19 05:27

編集2020/03/19 05:30
gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_aito0122

2020/03/19 05:29

WHERE句に金額を入れないで1行目だけを更新する方法はないですか?
gentaro

2020/03/19 05:34

無理です。更新対象を一行に絞る方法がありません。 WHERE句で絞れない場合は条件に一致した全ての行が更新されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問