製品、色、およびサイズを制御する 3 つのテーブルがあります。製品には色とサイズがあってもなくてもかまいません。色にはサイズがある場合とない場合があります。
product color size
------- ------- -------
id id id
unique_id id_product (FK from product) id_product (FK from version)
stock unique_id id_version (FK from version)
title stock unique_id
stock
すべてのunique_id
テーブルに存在する列はシリアル型 (オートインクリメント) であり、そのカウンターは 3 つのテーブルで共有され、基本的にそれらの間のグローバル ユニーク ID として機能します。
正常に動作しますが、に基づいていくつかのフィールドを選択する必要がある場合、クエリのパフォーマンスを向上させようとしていますunique_id
。
unique_id
探しているのがどこにあるのかわからないので、UNION
以下のように使用しています:
select title, stock
from product
where unique_id = 10
UNION
select p.title, c.stock
from color c
join product p on c.id_product = p.id
where c.unique_id = 10
UNION
select p.title, s.stock
from size s
join product p on s.id_product = p.id
where s.unique_id = 10;
これを行うより良い方法はありますか?ご提案ありがとうございます。
編集1
@ErwinBrandstetter と @ErikE の回答に基づいて、以下のクエリを使用することにしました。主な理由は次のとおりです。
1)unique_id
すべてのテーブルにインデックスがあるため、パフォーマンスが向上します
2) unique_id
i を使用すると製品コードが見つかるため、別の単純な結合を使用して必要なすべての列を取得できます
SELECT
p.title,
ps.stock
FROM (
select id as id_product, stock
from product
where unique_id = 10
UNION
select id_product, stock
from color
where unique_id = 10
UNION
select id_product, stock
from size
where unique_id = 10
) AS ps
JOIN product p ON ps.id_product = p.id;