SQLer 生島勘富 のブログ

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

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

問題を少し変更

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


SQLで考えるなら

 という風に考えます。

言い換える

 『在庫数が必要量を満みたす製品のみ』 → 『在庫数が必要量を満たさないレコードがある製品を削る』

 『満たさない』= NOT EXISTS(あるいは、NOT IN)

 答えは

  SELECT * -- 本当は必要なもののみ
  FROM
    部品表 AS bh INNER JOIN 在庫 AS zk
      ON bh.材料名 = zk.材料名
  WHERE
    NOT EXISTS (SELECT *
          FROM 部品表 AS bh_s INNER JOIN 在庫 AS zk_s
              ON bh_s.材料名 = zk_s.材料名
          WHERE bh_s.製品名 = bh.製品名 -- サブクエリ側と外側を繋ぐ
            AND zk_s.数量 < bh_s.必要量);

 ベースはこれだけの話なので、マスターなどが増えても同じです。

 生産管理系のシステムでは、このような処理がほとんどになりますが、手続き型で考えたらそれなりの時間が掛かるものでも、ほとんど何十秒で分かるようになります。このぐらいから、こちらにある問題
http://d.hatena.ne.jp/Sikushima/20100616/1276680064
のレベル程度のものが『イメージ』できるようになれば、実際にコーディングに多少の時間が掛かったとしても、一瞬で答えまでは行けるわけです。

 イメージが出来ていれば仕様書は書きようがありません。
 SQLでやるなら生産管理ぐらいのシステムなら、ER図、テーブル定義、項目移相表があれば、仕様書は要らないのです。