SQLでテーブルとテーブルをJOINの方法は知ってるけどCURSORの使い方がよく分からない。
私もそうでした。簡単な説明を求めてネット検索しても自分にはちょっと難しかったので、ここで出来るだけ簡単に説明してみます。
例えば会社を管理しているテーブルがあります。都道府県別に3つのテーブルに会社を振り分けたいとします。
以下の図をご覧ください。
カーソルを使わない場合は以下のクエリを実行すれば可能です。
INSERT INTO [東京都テーブル] ([会社名])
SELECT [会社名] FROM [会社テーブル] WHERE [都道府県] = '東京都'
INSERT INTO [神奈川県テーブル] ([会社名])
SELECT [会社名] FROM [会社テーブル] WHERE [都道府県] = '神奈川県'
INSERT INTO [静岡県テーブル] ([会社名])
SELECT [会社名] FROM [会社テーブル] WHERE [都道府県] = '静岡県'
でも、都道府県は47件あるので都道府県テーブルが47個あった場合、上のINSERTクエリを47個用意しなくてはなりません。
クエリを書くのが面倒ですし、将来都道府県が48件に増えた場合、また48個目のINSERTクエリが必要です。
そんな非効率な運用は嫌だ。こういう時にカーソルを使います。
以下にカーソルを含むクエリを用意しました。
DECLARE @SQLString nvarchar(255);
DECLARE @都道府県 nvarchar(10);
SET @SQLString = '';
DECLARE mycursor CURSOR FOR
SELECT DISTINCT [都道府県] FROM [会社テーブル]
OPEN mycursor
FETCH NEXT FROM mycursor
INTO @都道府県
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLString += ' INSERT INTO [' + @都道府県 + 'テーブル] ([会社名]) SELECT [会社名] FROM [会社テーブル] WHERE [都道府県] = ''' + @都道府県 + '''';
FETCH NEXT FROM mycursor
INTO @都道府県
END
CLOSE mycursor;
DEALLOCATE mycursor;
EXECUTE sp_executesql @SQLString;
このクエリで何をしているのか図にしてみました。
そもそもどうして都道府県テーブル別にデータを分けないといけないのか。
理由は、カーソルを説明する為にテーブルを分ける必要があったからです。。。もう1つの理由は、アプリケーション側の設計によりますがテーブルを分けることで検索速度を上げることができます。
SQLカーソルって便利ですね。尚、「@SQLString」に格納できる文字数は多めに見積もっておかないと、格納しきれない文字は切り捨てられ、未完成のクエリを実行してしまい、エラーになってしまうのでご注意を。
📂外資系企業へ転職・働き方:外資系企業の転職,英語,面接,働き方
📂国内旅行150ヵ所を紹介:北海道,屋久島
📂海外出張10カ国,50ヵ所以上観光:スペイン,インド,台湾.飛行機対策
📂健康:胃痛,風邪予防,食,メンタル
📂子育て:英語,育て方,旅行
📂PC関連:エンジニアの苦悩,効率化,Windowsのトラブル対応
📂海外ドラマ:海外ドラマ・映画のレビューと感想
📂車関連:海外のレンタカー,試乗レポート,軽自動車,等々
📂物件:新築一戸建て 申し込みから購入・引渡しまで色々あったこと