いつもお世話になっております。
C#でWEBアプリを作成しています。
ListViewでDBを表示して表を作っているのですが、
DBに番号のカラムを作成し、順番を入れ替えをしたいと思っています。
例えば初期のDBが以下の画像だとします
次に、みかんの2の数字を5にインサートするとします。
そうすると、次のように番号が整列します。
また、初期のDBからレモンの5を2にインサートするとします。
そうすると、次のように番号が整列します。
このように、一つの数字を変えたら順番になるように数字を整列させたいのですが可能でしょうか?
やり方をを調べてみましたが、
順番などで調べるとソートのことしか検索ででてこず
数字を変更したときの整列等なかなかでてこないので全く何からすればいいのかもわからずにいます。
なにか参考になるサイトや、アドバイスが欲しいです。
どうかよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
※ 主キーではない順番フィールドと更新日付フィールドを定義していることが前提です。
1:任意の順番番号、更新日付フィールド=現在日時でupdate
-> この時点では順番番号が被ると思いますが、更新日付で順番番号を優先させることができます。
2:リンク先を参考に、ROW_NUMBER()を使い順番フィールドを一括update
-> ROW_NUMBER()は順番フィールド、更新日付の降順でselectします。
投稿2016/07/01 05:26
編集2016/07/01 05:27総合スコア163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
気分転換に代理検索他行ってみました。
’
初期のDBからレモンの5を2にインサートするとします。
INSERT 文を発行してしまったら、データの件数が増えてしまいます。
既存データの書換は、UPDATE 文でデータの書換を行います。
'
人工キー:artifical key
自然キー:natural key
代替キー:surrogate key
’
SQL リナンバー
https://www.google.co.jp/search?hl=ja&q=SQL+%E3%83%AA%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC&lr=lang_ja&gws_rd=ssl
’
SQL Server ROW_NUMBER
https://www.google.co.jp/search?hl=ja&q=SQL+%E3%83%AA%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=SQL+Server+ROW_NUMBER'
'
SQL 値 交換
https://www.google.co.jp/search?hl=ja&q=DB+INSERT+%E5%8F%A5&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=SQL+%E5%80%A4+%E4%BA%A4%E6%8F%9B
では目的の事柄が出て来ないですが
’
SQL 値 SWAP
https://www.google.co.jp/search?hl=ja&q=SQL+%E3%83%AA%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=SQL+%E5%80%A4+SWAP
では、名著「プログラマのためのSQL 第4版」監訳ミック、がヒットしました。
プログラマのためのSQL 第4版 - 342 ページ
SQL で値を入れ替える最も簡単な方法は、UPDATE文を何個も書くことだ。SET句では複数の列を書けることを覚えているだろうか。、、、
’
集合論に於いては、順番の概念は存在しません。
順番は、人と処理の都合の為に存在します。
⇒データが登録順に呼出される事は規定されません。
あくまでも実装上の都合でそうみえるだけです。
’
MS SQL Server を使う場合は、MS SQL Server Management studio を入れて
Management studio 上で、テーブル、クエリ、ストアド、スクリプトの単体確認
パフォーマンス確認をしたりします。
⇒Local DB / Attached DB では、SQL Server インスタンスにいないので、注意
(コード実行中、デバッグ中はプロパティ設定により、何れのDBが使用されるかが決まります。)
’
例えば
’
テーブル名 :tstsmpl とします。
ID:bigint:主キー とします。連番とします。(IDENTITYの指定:はい)
適切な一意のnatural key が無い場合は、
artifical key として、連番や、GUIDを使います。
VS20xx でDBを扱おうとすると、主キーありきの場合が多いですので
主キーに困った時は、IDで連番を付けます。
cID:bigint:表示順番号のカラム とします。表示順として使用します。
UNIQUE 制約を掛けてしまうと、一意に規定されるので、UNIQUE制約は取りあえずかけない
fNm:nvarchar(50):果物名称 とします。
’
前提:表示順に抜けが無い、1番から連番で昇順に表示順番号が付いている
データ:表示順1~10迄値が入っているとします。
cID fNm
1 りんご
2 みかん
3 バナナ
4 キウィ
5 レモン
6 ブドウ
7 もも
8 イチゴ
9 スイカ
10 ナシ
簡単な例
【1】2番⇒5番
影響範囲、2、3、4、5
SELECT ID,cID, fNm FROM tstsmpl WHERE (cID BETWEEN 2 AND 5) ORDER BY cID
2番を、表示範囲外の数値に
UPDATE tstsmpl SET cID = 1000 WHERE cID = 2
3番~5番を-1
UPDATE tstsmpl SET cID = cID - 1 WHERE (cID BETWEEN 3 AND 5)
旧2番を5番に
UPDATE tstsmpl SET cID = 5 WHERE (cID = 1000)
【2】5番⇒2番
影響範囲、2、3、4、5
SELECT ID,cID, fNm FROM tstsmpl WHERE (cID BETWEEN 2 AND 5) ORDER BY cID
5番を、表示範囲外の数値に
UPDATE tstsmpl SET cID = 1000 WHERE cID = 5
2番~4番を+1
UPDATE tstsmpl SET cID = cID + 1 WHERE (cID BETWEEN 2 AND 4)
旧5番を2番に
UPDATE tstsmpl SET cID = 2 WHERE (cID = 1000)
仕上げは、【1】、【2】で、固定値でバラバラに行っている事を、複合クエリで書いたり、
ストアド+パラメーターで書いたり、
VS20xxで、パラメタライズドクエリで書いたりします。
投稿2016/06/29 09:07
編集2016/06/29 09:17総合スコア2028
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
地道に(矛盾なく)自分で update かけるしかないかなあ。
整列に関しては select する時の order 指定しだいなので
気にする必要はないと思います。
投稿2016/06/29 08:03
総合スコア7458
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
順番を変えたいというようなときは、
みかんの数字を5 レモンの数字を2にするだけです。
番号順に並べ替える というのはやりません。
DBからデータを取得する際に
その番号の順で取得をする指定をするだけです。
逆に、なにかの順でと指定しなければ 順番は保証されません。
投稿2016/06/29 07:39
編集2016/06/29 07:40退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。