2017-10-03 15 views
0

私は3つのテーブルを含むMySQLデータベースを持っています。データベースには、さまざまな電気および機械部品に関する情報が含まれています。それは3つのテーブルを持っています。テーブル内の行データから作成された列を使用してMySQLでビューを作成しますか?

テーブル:

  1. :コンポーネント - データベースの情報はから供給された場所についての情報を含みます。
  2. コンポーネント - 複数のエントリは、コンポーネントソーステーブルの1つのエントリをソースとして参照します(各ソースファイルには、複数のコンポーネントが記述されています)。
  3. 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)に基づいて列を作成するビューを作成することはできますか?例を見せてもらえますか?

そうでなければ、同じことをするテーブルを構築できますか?繰り返しますが、例を示すことができますか?

多くのありがとうございます。

+0

クエリを書き込むときにすべての(将来の)パラメータがわからない場合、これはビューでは実行できません。冗長データを持つ別のテーブルも良い考えのようには聞こえません。クエリを動的に構築するストアドプロシージャが機能するはずです。しかし、私はむしろアプリケーション言語でデータを "ピボット"したいと思います。 –

+0

アプリケーションコード – Strawberry

+0

にデータ表示の問題を扱うことを真剣に考えてください。MySQLには、ネイティブの 'ピボット'または 'クロスタブ'のサポートがなく、ここでの制限になります。あなたはいつでもそれを偽造することができます... https://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns Postgres、MSSQL、Oracle、その他ほとんどのDBMSがこれを多く処理しますクリーナー – Twelfth

答えて

1

条件付き集約は、このためにサブクエリを使用することも可能であるあなた

SELECT cp.compID, 
     ct.partNum, 
     ct.mfrPartNum, 
     ct.mfr, 
     cs.SourceFile, 
     MAX(CASE WHEN cp.paramName = 'ParamA' THEN cp.ParamValue END) as ParamA, 
     MAX(CASE WHEN cp.paramName = 'ParamB' THEN cp.ParamValue END) as ParamB, 
     MAX(CASE WHEN cp.paramName = 'ParamC' THEN cp.ParamValue END) as ParamC, 
     MAX(CASE WHEN cp.paramName = 'ParamD' THEN cp.ParamValue END) as ParamD, 
     MAX(CASE WHEN cp.paramName = 'ParamE' THEN cp.ParamValue END) as ParamE, 
     MAX(CASE WHEN cp.paramName = 'ParamY' THEN cp.ParamValue END) as ParamY, 
     MAX(CASE WHEN cp.paramName = 'ParamZ' THEN cp.ParamValue END) as ParamZ 

FROM componentParameters cp 
JOIN component ct ON cp.compId = ct.compId 
JOIN componentSource cs ON cs.compSrcID = ct.compSrcID 
GROUP BY cp.compID, 
     ct.partNum, 
     ct.mfrPartNum, 
     ct.mfr, 
     cs.SourceFile 

のための旋回を行うことができます、しかし、私はこれは、より良い仕事をする必要がありますね。

+0

ありがとうございます。これはまさに私が必要とするものです。 –

+0

@DaveL。どういたしまして! –

関連する問題