その4)SQLテクニック 副問い合わせと同じ結果を取得

その4)SQLテクニック 副問い合わせと同じ結果を取得

この記事を読むのに必要な時間は約 6 分です。

前回まではSelect文の基本的な使い方なり検索の仕方などを説明してきました。今回からは一気に内容を濃ゆくしていろいろな技術的な方法を小出しで出していきたいと思います。関数なども利用していきますのでその都度その都度覚えてください。

副問い合わせと同じ結果を取得

慣れればこっちの方が簡単だし早い

前回、副問い合わせで値を求めていましたが、もうちょっと簡単な方法で目的のデータを求めてみたいと思います。

この記事から見てしまった人は前回の記事からスタートしてください。

まずは、市区町村の数が100の都道府県を求めます。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT  [漢字都道府県名] 
  FROM [test001].[dbo].[shicyouson] where num='100'

まずは、ここまでは簡単ですね。

今度はこの結果をそのままテーブルとして利用し、メインのテーブルと結合します。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT TOP (1000) A.[漢字都道府県名]
      ,[漢字市区町村名]
      ,[num]
  FROM [test001].[dbo].[shicyouson] A
  left outer join
  (
      SELECT  [漢字都道府県名]   FROM [test001].[dbo].[shicyouson] where num='100'
  ) B
  on
  A.漢字都道府県名=B.漢字都道府県名
left outer join

行き成り出てきましたね。これは左側外部結合です。お友達に右側外部結合と完全外部結合など色々あります。

下の方が見切れていますが、数千行ほど表示されています。

この結果を見るとよくわからないのですが、クエリをこのように書き換えます。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT TOP (1000) A.[漢字都道府県名]
      ,[漢字市区町村名]
      ,[num]
	  ,B.*
  FROM [test001].[dbo].[shicyouson] A
  left outer join
  (
      SELECT  [漢字都道府県名]   FROM [test001].[dbo].[shicyouson] where num='100'
  ) B
  on
  A.漢字都道府県名=B.漢字都道府県名

ソースコード上で5行目の内容ですね。

B.*

これは、テーブルBのカラムをすべて表示するという意味です。

上の図を見て見ると福岡県のところに値があり、それ以外がNULLとなっています。

 

感が良い人はこの時点で気づきますかね。

この、値がNULLになっている場所を消したデータが目的のデータになっています。

ソースコードは以下です。

/****** SSMS の SelectTopNRows コマンドのスクリプト  ******/
SELECT TOP (1000) A.[漢字都道府県名]
      ,[漢字市区町村名]
      ,[num]
	  ,B.*
  FROM [test001].[dbo].[shicyouson] A
  left outer join
  (
      SELECT  [漢字都道府県名]   FROM [test001].[dbo].[shicyouson] where num='100'
  ) B
  on
  A.漢字都道府県名=B.漢字都道府県名
  where B.漢字都道府県名 is not null

はい。目的のデータにたどり着けましたね。

ちょっとだけ、長くなってしまいましたが、この書き方の場合、圧倒的にイメージがしやすいです。

もともと今回のお題は元のテーブルに対して特定の条件で絞り込んだ結果に対してされに絞り込みを行う物です。

なので、テーブルを二つぶつけて、ぶつかった物が対象となることがイメージできるのであれば直ぐに書くことができます。

※ 仮に、not existsを求めたい場合は、 is null を is not null に書き換えれば良いです。

この書き方が非常にイメージしやすい事と、検索コストが非常に小さくなる可能性が大きい方法ですのでお勧めの書き方です。

ちょっと難しかったかもしれませんが、これを覚えれば副問い合わせを覚えなくてもよくなりますのでお勧めです。

本日はここまで!

 

タイトルとURLをコピーしました