2017-09-11 7 views
0

質問を書く方法がわかりません。2つのクエリからリレーションテーブルにデータを挿入する方法

は、私はこれらの3つのテーブルを持っている:

PICTURES 
id 
name 

MATERIALS 
id 
name 

PICTURES_MATERIALS 
picture_id 
material_id 

私は写真と5つの物質の何千ものを持っているし、絵のほとんどは、すべての材料を持っています。 このクエリを使用して、私は約100枚の写真に何も材料がないことを知りました。

select p.id, p.name 
from pictures as p 
left outer join pictures_materials as pm on p.id = pm.picture_id 
where pm.picture_id is null; 

私が今やってみたいのは、画像ごとに、各素材の画像ごとに行を挿入することです。 それでは、これらは無材料と一緒に写真の一部であることを言わせて:

picture_21, picture_22, picture_23 

を私がしたい:それは、クエリINTO、単一のINSERTでこれを行うことが可能

picture_21 material_1 
picture_21 material_2 
picture_21 material_3 
picture_21 material_4 
... 

ですか?

答えて

1

これは単一のINSERT INTOクエリで行うことはできますか?

はい!

デカルト製品を作成する正当な理由が1つ見つかりました。これを行うにはCROSS JOINを使用します。このクエリを試してみてください。

-- insert into picture_materials 
select dt.id, m.id 
from (select p.id 
from pictures as p 
left outer join pictures_materials as pm on p.id = pm.picture_id 
where pm.picture_id is null) dt 
cross join materials 

Selectステートメントが適切なデータを返すことを検証した後、INSERTステートメントのコメントを外して再度実行します。

+0

ありがとう、これは完璧です。好奇心のために、「dt」は何を表していますか? – Carlo

+0

dt由来テーブル。それはSybaseとSQL Serverで呼び出されたものかもしれません。 Oracleはそれらをインライン・ビューと呼びます。私はMySQLが何を呼び出すかを調べなければならないでしょう。基本的には、クエリの結果をテーブルとして参照しています。 –

+0

私はその仕組みが分かっていたので、エイリアスが何を表しているのか分かりませんでした – Carlo

関連する問題