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

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

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

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

Q&A

1回答

564閲覧

T-SQLでやりたいことの実現方法

trtl21

総合スコア15

SQL

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

0グッド

0クリップ

投稿2017/06/12 11:13

編集2017/06/12 11:45

No1 No2 Name KBN
10 10 あ 1
20 21 い 1
30 30 え 9
48 45 お 1
50 50 さ 9
60 68 た 1

DBに上記のようなTableがあるとします。
このうち、No1と2はアプリケーションから変更可能な項目になります。
DBから値をSELECTし、結果を何かに使用する際の並び順は常にNo1 > No2の昇順です。

このような場合、KBNが9のデータについて並び順が変わってしまう場合についてチェックを行いたいです。

例)Nameが「い」のNo1を31に変更すると
「え」が上から数えて3→2つ目になる。
このような場合をチェックに引っかけたい。

このようなチェックを行う場合、どのようなクエリを書けばよいでしょうか?

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

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

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

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

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

yambejp

2017/06/12 11:26

SQLの種類によって処理がかわってきます。ちなみにSQLにはデータの順番という概念はありません。ORDERBYでソートをした場合に初めて順番が発生します。
trtl21

2017/06/12 11:33 編集

種類はTransact-SQLになります。言葉足らずでした、SELECT時に明示的に並び順はORDER BYで指定します。
guest

回答1

0

Transact-SQLの仕様はよくわからないので、一般的なSQLで

SQL

1create table tbl(no1 int,no2 int,Name varchar(10),KBN int); 2insert into tbl values(10,10,'あ',1),(20,21,'い',1),(30,30,'え',9),(48,45,'お',1),(50,50,'さ',9),(60,68,'た',1); 3

ここでno1が20から31に変わるので、no1の範囲を20~31で検索すればよいことになります
トランザクションやテンポラリテーブルなどつかえるのであればよいのですが
まず

SQL

1select (select count(*)+1 from tbl as t2 where t2.no1<t1.no1 and t2.no1 between 20 and 31) as rank,KBN from tbl t1 where no1 between 20 and 31 order by no1 asc; 2

でランク付けしたKBNの値を得ておき

SQL

1update tbl set no1=31 where no1=20; 2select (select count(*)+1 from tbl as t2 where t2.no1<t1.no1 and t2.no1 between 20 and 31) as rank,KBN from tbl t1 where no1 between 20 and 31 order by no1 asc; 3

no1をupdateした上で、再度おなじSQLデータをえます。
今回のケースですと、1,9が9,1になっているので「変化する」とわかります
目で見比べるのでなければ、それぞれをテンポラリテーブルに保管しておいて
rankとKBNのが完全に合致する状態でJOINしてcountし
データ件数があっているかどうかでチェックができます。
トランザクションができるならテスト後にrollbackすれば元にもどります

投稿2017/06/12 11:54

yambejp

総合スコア114839

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

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

yambejp

2017/06/12 11:56

SQLの種類によってはKBNのデータをgroup_concatして変数に保管して置き、比べるというのでもよいでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問