0

次のデータがあるとします。

Product
IdPk  |  Name
-------------
guid1 |  Printer
guid2 |  Oil
guid3 |  Etc.
guid4 |  Etc..

ProductPart
PartIdPk| ItemId | PartName
-------------------------
guid100 | guid1  | Ink
guid101 | guid1  | Paper
guid102 | guid2  | Automobile Fuel
guid103 | guid2  | Cooking

ProductPartType
TypeIdPk| ItemId | PartId  | TypeName
---------------------------------
guid200 | guid1  | guid100 | Cyan            < Types of ink
guid201 | guid1  | guid100 | Magenta
guid202 | guid1  | guid100 | Black
guid203 | guid1  | guid100 | Yellow
guid204 | guid1  | guid101 | Photocopier     < Types of paper
guid205 | guid1  | guid101 | Envelope
guid206 | guid1  | guid101 | Card
guid207 | guid2  | guid102 | Petrol          < Types of automobile fuel
guid208 | guid2  | guid102 | Diesel
guid209 | guid2  | guid103 | Olive           < Types of cooking oil
guid210 | guid2  | guid103 | Sunflower

したがって、各製品には 1 つ以上のパーツがあり、各パーツには 1 つ以上のタイプがあります。

製品、その部品、およびそのタイプを選択したいと考えています。何千ものエントリがある可能性があると仮定すると、通常は選択と同時にフィルタリングしたいと思います。これらの 3 つのテーブルは、多くの場合、デカルト製品クエリにつながります。そのシナリオを考えると、「(パーツがインクであるタイプ名) で注文された上位 2 つの製品を教えてください」と同等のクエリを実行する必要があります。一部は料理)」

誰にもアイデアはありますか?よろしくお願いします

4

1 に答える 1

0

探しているのは、テーブルに対する基本的な結合クエリです。

select ppt.*, pp.PartName, p.Name
from ProductPartType ppt join
     ProductPart pp
     on ppt.PartId = pp.PartId join
     Product p join
     pp.ItemId = p.idPK
where <whatever>

その後、必要なクエリを実行できます。注文する自然なものがないため、「トップ」クエリは不明確です。

製品部品と製品部品タイプの両方のレベルで製品を持っているため、データ構造に問題があります。一貫性を保つために、これはおそらくプロダクト パーツのレベルのみで使用することをお勧めします。

通常、「デカルト積」結合は、等結合ではなく、交差結合を指すために使用されます。パフォーマンスのために、テーブルにインデックスを追加できます。ただし、おそらくそれらは必要ありません。

于 2012-05-10T13:45:50.070 に答える