私は製品を持っています。各製品は、アイテムとアセンブリで構成されています。アセンブリ自体もアイテムで構成できます。つまり、これは階層ですが、深さが限られています。私がやりたいのは、製品に含まれるアイテムとアセンブリ、および製品のアセンブリ内のアイテムをリストすることです。
これは私が見たい出力です。これとまったく同じである必要はありませんが、目的は、製品内のアイテム、アセンブリ、および各アセンブリ内のアイテムを表示することです。列の数は固定されていません。アセンブリ内のアイテムを表示するためにさらに必要な場合、問題はありません。
ProductID ProductName AssemblyID AssemblyName ItemID ItemName
--------- ----------- ---------- ------------ ------ --------
P0001001 Product One
I0045 Item A
I0082 Item B
A00023 Assembly 1
I0320 Item 1
I0900 Item 2
A00024 Assembly 2
I0877 Item 3
I0900 Item 2
I0042 Item 4
これを使用して、製品 ID でグループ化されたレポートを作成し、各製品の内容を一覧表示できます。
これは私が現時点で持っているテーブル構造です。
+ProductList-+ +ProductItems-+
|ProductID | ----------> |ProductID | +ItemList-+
|ProductName | \ |ItemID | --------------------------------> |ItemID |
|Price | \ +-------------+ > |ItemName |
+------------+ \ / |Cost |
\ +ProductAssemblies-+ / +---------+
\-> |ProductID | +AssemblyItems-+ /
+-- |AssemblyID | ----> |AssemblyID | /
| |BuildTime | |ItemID | ---/
| +------------------+ +--------------+
|
| +AssemblyList-+
+-> |AssemblyID |
|AssemblyName |
+-------------+
これを行うには、どのような SELECT ステートメントが必要でしょうか。
ある種の外部結合が必要だと思いますが、select ステートメントを構造化する方法を知るために、SQL 構文を完全に理解しているわけではありません。私のすべての努力は常に、各アイテムとアセンブリに対して製品が複数回リストされることにつながりました. したがって、製品に 3 つのアイテムと 2 つのアセンブリがある場合、製品は 6 回表示されます。
この種の問題を検索するのは簡単ではありません。何を検索する必要があるのかわからないからです。それは 3 つのテーブルの問題ですか、外部結合の問題ですか、それとも単純な構文上の答えですか。
それとも、アセンブリを使用しない純粋な階層テーブル構造に切り替えたほうがよいのでしょうか? 階層テーブルを検索して、発生する可能性のある問題を解決する方が簡単です。
LibreOffice 3.5.6.2 ベースを使用しています。ウィザードやその他の便利な機能がありますが、私がいる状況の複雑さには対応していません。データベースに価格が含まれており、それを使用して、アイテムのコストから製品の価格を適切に割り出すことができるようにすることを目的としています。アセンブリを構築する時間。
優しくしてください、私はSOの初心者です。