SQLer 生島勘富 のブログ

RDB・SQLの話題を中心に情報発信をしています。

SQL的(集合的)考え方と、ループ(手続き型)の考え方2

もう一度問題

 問題)部品在庫から、作成可能な製品名をとる。
 ※本来はマスタテーブルと組み合わすべきですが、ツールの関係上2テーブルしか同時に表示出来ないので名称で結合する形になります。


SQLで考えるなら



 答えは
  SELECT 製品名
  FROM
    部品表 INNER JOIN 在庫
      ON 部品表.材料名 = 在庫.材料名
  GROUP BY 製品名
  HAVING MIN(在庫.数量 - 部品表.必要量) >= 0;

 三枚の図になっていますが、考え方さえ理解していれば数十秒で答えまでたどり着けます。パターン認識じゃないので忘れてもどってことはないのです。

 考え方としてはこんな感じになります。

 必要なテーブルを引っ付け、ゴールを目指して削り出して行けば良い。
 プラモデルと、彫刻の違いです。

言い換えは、他の言語より重要?

 プログラムも翻訳と同じですから、言い換えは必要です。
 上の図の「SQL的思考3」でも、言い換えが必要なのですが、それほど難しい言い換えをしているわけではありません。

 冷静に見て、「部品在庫から、作成可能な製品名をとる」を、「ソートして、製品名がブレイクしたとき……」と意訳することと比べたら、SQLの方がはるかに直訳に近いでしょう。

 逆に、直訳でできるのに、「ソートして、製品名がブレイクしたとき……」なんて仕様書を作られても、ゴミでしかないのです。