私は3つのテーブルを含むMySQLデータベースを持っています。データベースには、さまざまな電気および機械部品に関する情報が含まれています。それは3つのテーブルを持っています。テーブル内の行データから作成された列を使用してMySQLでビューを作成しますか?
テーブル:
- :コンポーネント - データベースの情報はから供給された場所についての情報を含みます。
- コンポーネント - 複数のエントリは、コンポーネントソーステーブルの1つのエントリをソースとして参照します(各ソースファイルには、複数のコンポーネントが記述されています)。
- componentParams - コンポーネントに関するパラメトリック情報が含まれています。複数のパラメータエントリは、コンポーネントテーブルの1つのエントリを参照します(各コンポーネントには複数のパラメータがあります)。
は...
データベーステーブルとの関係を簡略化した例の表を参照してください:
+-------------------------------+
| Table: componentSource |
+-------------------------------+
| compSrcID* | sourceFile |
+-------------------------------+
| 1 | comp1.txt |
| 2 | comp2.txt |
| 3 | comp3.txt |
+-------------------------------+
^
|
+---------------------------------------------------+
(many to one reference) |
^
^
+---------------------------------------------------------------+
| Table: component |
+---------------------------------------------------------------+
| compID* | partNum | mfrPartNum | mfr | compSrcID |
+---------------------------------------------------------------+
| 1 | 1234 | ABCD | BrandA | 1 |
| 2 | 2345 | BCDE | BrandB | 1 |
| 3 | 3456 | CDEF | BrandC | 3 |
| 4 | 4567 | DEFG | BrandD | 2 |
+---------------------------------------------------------------+
^
|
+---------------+ (many to one reference)
|
^
^
+-------------------------------------------------------+
| Table: componentParams |
+-------------------------------------------------------+
| compParamID* | compID | paramName | paramValue |
+-------------------------------------------------------+
| 1 | 1 | ParamA | 50 |
| 2 | 1 | ParamB | 123 |
| 3 | 1 | ParamC | 10% |
| 4 | 1 | ParamD | 0.5 |
| 5 | 1 | ParamE | Active |
| 6 | 2 | ParamA | 25 |
| 7 | 2 | ParamB | 10K |
| 8 | 2 | ParamC | 5% |
| 9 | 2 | ParamD | 0.25 |
| 10 | 2 | ParamE | Proto |
| 11 | 3 | ParamA | 53.6 |
| 12 | 3 | ParamE | Active |
| 13 | 4 | ParamY | 123-56 |
| 14 | 4 | ParamZ | True |
+-------------------------------------------------------+
私は3つのテーブルからの情報をマージしたデータベースのビューを作成したいと思います。私は、コンポーネントテーブル内の各行に対して、コンポーネントソーステーブルの関連する行と、componentParamsテーブルの関連するすべてのパラメータをマージするテーブルを作成したいとします。
例ビュー...
データベースビューを参照してください:私はコンポーネントテーブル内の各コンポーネントのビューで行をしたいので、私はからの情報を統合すると思います
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| View: componentView |
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| compID* | partNum | mfrPartNum | mfr | SourceFile | ParamA | ParamB | ParamC | ParamD | ParamE | ParamY | ParamZ |
| 1 | 1234 | ABCD | BrandA | comp1.txt | 50 | 123 | 10% | 0.5 | Active | | |
| 2 | 2345 | BCDE | BrandB | comp1.txt | 25 | 10K | 5% | 0.25 | Proto | | |
| 3 | 3456 | CDEF | BrandC | comp3.txt | 53.6 | | | | Active | | |
| 4 | 4567 | DEFG | BrandD | comp2.txt | | | | | | 123-56 | True |
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
をcomponentSourceテーブルはかなり単純に結合されていますが、難しいのはcomponentParam.paramNameカラムの値に対応するカラムをビューに作成することです。このように、コンポーネントに関連するすべてのパラメータを読み取るには再帰が必要です。また、すべてのコンポーネントがパラメータテーブル内のすべてのパラメータを持つわけではないので、コンポーネントで使用されないパラメータの値はnullになります。
ビューを作成する代わりに、それができない場合は、別のデータベーステーブルを作成することもできます。
私のSQLスキルは超錆びており、新鮮なときにはおそらくこの作業にはあたらなかったでしょう。
テーブル内の行データ(paramName)に基づいて列を作成するビューを作成することはできますか?例を見せてもらえますか?
そうでなければ、同じことをするテーブルを構築できますか?繰り返しますが、例を示すことができますか?
多くのありがとうございます。
クエリを書き込むときにすべての(将来の)パラメータがわからない場合、これはビューでは実行できません。冗長データを持つ別のテーブルも良い考えのようには聞こえません。クエリを動的に構築するストアドプロシージャが機能するはずです。しかし、私はむしろアプリケーション言語でデータを "ピボット"したいと思います。 –
アプリケーションコード – Strawberry
にデータ表示の問題を扱うことを真剣に考えてください。MySQLには、ネイティブの 'ピボット'または 'クロスタブ'のサポートがなく、ここでの制限になります。あなたはいつでもそれを偽造することができます... https://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns Postgres、MSSQL、Oracle、その他ほとんどのDBMSがこれを多く処理しますクリーナー – Twelfth