Products
である 3 つのテーブルからデータをフェッチしたい
1 つの製品に複数の機能と属性がある場合がAttributes
あるfeatures
クエリを使用しています
select *
from products p, features f, attributes a
where p.id =1 and p.id = f.id and p.id = a.id
クエリがOKかどうか知りたい???
ANSI SQL-89
構文を使用しています。ただし、ANSI SQL-92
構文を使用することをお勧めします。その例を以下に示します。
SELECT *
FROM products p
INNER JOIN features f
ON p.id = f.id
INNER JOIN attributes a
ON p.id = a.id
where p.id =1
このように、構文エラーを回避するために、それらの関係(句)をON
明示的に定義する必要があります。構文はエラーが発生しやすく、ANSI SQL-89
エラーが発生しないため、気付かない場合があります。例
SELECT *
FROM products p, features f, attributes a
where p.id =1
リレーションシップフィールドを定義しなくても実行されますが、無効な結果が得られます。からINNER JOIN
、今ですCROSS JOIN
追加情報
これは内部結合です。機能や属性のない製品も取得したい場合は、 を使用する必要がありますLEFT JOIN
。p.feature_id
また、やなどの結合には外部キーを使用する必要がありますp.attribute_id
。
SELECT *
FROM products p
LEFT JOIN features f ON p.feature_id = f.id
LEFT JOIN attributes a ON p.attribute_id = a.id
WHERE p.id = 1
結合を ANSI として記述して、読みやすくしたい場合があります (ANSI と古い構文のコメントを合図にしてください :) )
select
*
from
products p
left join features f
on p.id=f.id
left join attributes a
on p.id=a.id
3つのテーブルすべてのデータをフェッチする必要があるようなタイプの要件には、内部結合を使用する必要があります。次に例を示します。
SELECT p.prduct_id,p.product_name,a.attribute,f.feature
FROM product AS p
INNER JOIN attribute AS a ON ( p.product_id = a.attribute_id )
INNER JOIN feature AS f ON ( a.id = f.feature_id )
上記のクエリのように、親テーブル製品の属性と機能テーブルに外部キーが必要です。
そうではありません。値が逆になっています
SELECT * FROM
products p,
features f,
attributes a
WHERE
p.id = 1 AND
f.id = p.id AND
a.id = p.id
しかし、それはあなたが求めていることをしません.ここで3つのクエリを実行する方が良いでしょう.IMO.