次のように読みやすい結果セットが得られる、信じられないほど複雑な SQL クエリ (3 つの INNER JOINS) があります (簡略化)。データベースを継承したため、既存のテーブルの構造を変更することは不可能であるため、複雑なクエリを実行してこの時点に到達する必要があります。
product_category | product_code
------------------------------------
Hardware 102
Hardware 104
Hardware 102
Software 205
Software 104
次に、単純にGROUP BY
product_category、product_code を実行すると、関心のある最終的な結果セットのほとんどが得られます。
product_category | product_code
------------------------------------
Hardware 102
Hardware 104
Software 205
Software 104
ただし、不足しているのは在庫数です。
product_category | product_code | num_in_stock
--------------------------------------------------------
Hardware 102 2
Hardware 104 1
Software 205 1
Software 104 1
COUNT()
ステートメントで行われる処理から直接できるようにしたいのでGROUP BY
、少し迷っています。
これまでの SQL クエリは次のとおりです。
SELECT categories.product_category, codes.product_code FROM stock
INNER JOIN products ON stock.product_id = products.id
INNER JOIN codes ON products.code_id = codes.id
INNER JOIN categories ON codes.category_id = categories.id
GROUP BY categories.product_category, codes.product_code
表は次のとおりです。
CATEGORIES
- 例: 「ハードウェア」、「ソフトウェア」CODES
- 例: 100、204 (に属するcategory
)PRODUCTS
-categories
+の組み合わせcodes
、役に立たないバージョン #STOCK
・商品のエントリー、在庫が複数ある場合は複数エントリーあり
これが非常に厄介なのは、 の役に立たないversion #
フィールドが原因ですPRODUCTS
。これが意味することは、特定の組み合わせ (例: "Hardware 102")PRODUCTS
に対して、それぞれ異なるversion #
値で複数回入力できることです。これにより、同じ製品であるにもかかわらず、異なるものSTOCK
を参照することになります。 . うーん!ids
PRODUCTS
何か案は?
編集:
たとえば、2 つの異なるバージョンを持つ製品「Misc 999」があるとします。これはCATEGORIES
、"Misc"のエントリ、 CODES
"999"のエントリ ( category_id
"Misc" に属するもの)、および 2 つのエントリPRODUCTS
(両方とも同じcode_id
であるが異なるversion
情報を持つ - 私は無視しています) があることを意味します。 .
次に、これらの在庫が 10 個ある場合 (一方のバージョンが 3 個、もう一方のバージョンが 7 個ですが、バージョン情報は無視します)、STOCK
テーブルには 10 個のエントリがあり、それぞれがPRODUCTS
( id
2 つのこの場合は異なる ID)。