2011-11-17 11 views
8

私はこれが可能かどうか疑問に思います。MYSQLは列データとテーブル名に基づいてテーブルを結合します

テーブル1のデータに基づいて2つのテーブルを結合したいとします。 テーブル1の例は、データを「ホットドッグ」としたカラムフードです。

そして私にはhotdogというテーブルがあります。

JOINのようにすることができます。

SELECT * FROM table1 t join t.food on id = foodid 

私はそれがうまく動作しないことを知っていますが、その可能性もあります。

ありがとうございます。

+1

これはデザイン上の問題のようです。実行時まで結合がわからない場合は、参照整合性をどのように強化しますか? – tomfumb

答えて

9

いいえ、table1の行ごとに別のテーブルに参加することはできません。@Cade Rouxの示唆するように動的SQLを使用することはできません。

食べ物が「ホットドッグ」で、他の特定の値段の食べ物を食べる行はhotdogテーブルに参加できます。

SELECT * FROM table1 JOIN hotdog ON id = foodid WHERE food = 'hotdog' 
UNION 
SELECT * FROM table1 JOIN apples ON id = foodid WHERE food = 'apples' 
UNION 
SELECT * FROM table1 JOIN soups ON id = foodid WHERE food = 'soup' 
UNION 
... 

これは、すべての個別のフードテーブルに互換性のある列があることを前提としています。

多型関連と呼ばれています。つまり、table1の外部キーは、別の列の値に応じて、複数の「親」表の行を参照します(table1)。これは、リレーショナルデータベースプログラマの一般的な設計ミスです。代替ソリューションについては

に私の答えを参照してください。

私も自分のプレゼンテーションPractical Object Oriented Models In SQLにポリモーフィック団体のためのソリューションをカバーし、私の本SQL Antipatterns: Avoiding the Pitfalls of Database Programmingインチ

0

動的SQLのみ。また、多くの異なるテーブルを結合して型に基づいてCASEを使用することも可能ですが、テーブルはすべて事前に知られている必要があります。

達成しようとしていること、デザインが現在どのように見えているのか、最初にその特定のテーブルデザインを選択した理由を知っていれば、適切なデザインをお勧めします。

Say you have a table of foods: 

id INT 
foodtype VARCHAR(50) (right now it just contains 'hotdog' or 'hamburger') 
name VARCHAR(50) 

Then hotdogs: 

id INT 
length INT 
width INT 

Then hamburgers: 

id INT 
radius INT 
thickness INT 

通常、補助テーブルが1つしか存在しないようにするシステムをお勧めしますが、簡単にするために、私はそれを省略しています。

SELECT f.*, hd.length, hd.width, hb.radius, hb.thickness 
FROM foods f 
LEFT JOIN hotdogs hd 
    ON hd.id = f.id 
    AND f.foodtype = 'hotdog' 
LEFT JOIN hamburgers hb 
    ON hb.id = f.id 
    AND f.foodtype = 'hamburger' 

今、あなたはそのようなことは、テーブル名とテーブルのメタデータへのアクセスに関するSELECT DISTINCT foodtype FROM foods与えられた一定の仮定からのコード生成(あるいはその場で非常に遅いプロトタイプの動的SQLのために)ことができることがわかります。

問題は、最終的にこのクエリの結果を消費する人は、新しいテーブルが追加されるたびに新しいカラムが表示されることに気付く必要があるということです。

したがって、質問はお客様のクライアント/データの消費者に戻ります。さまざまなタイプをどのように処理するのでしょうか?そして、同じタイプの異なるタイプが何を意味するのでしょうか?とにかく、そのような変更の相対的な影響を考慮して、新しいタイプが追加されたときに手動クエリーを変更したり、タイプごとに異なるクエリーを書くだけの欠点は何ですか?

+0

再生のためのThnks .... 私は組合のソリューションが好きではないと思っています。だから詳細をheres。 生徒は、「要請」テーブルで手紙の一部を要求し、生徒のデータと「手紙の種類」が保存されます。 Theresは "レタータイプ"のための10の異なる可能な値です。だから私は特定の文字タイプ名のような特定の文字タイプ名を持つテーブルがある テーブルrecomendation テーブル転送、 私は1つのクエリですべてのSELECTを行う方法が必要でした。そこからデータを取得します。 – user1052347

+0

@ user1052347 Bill Karwinはデザインへのリンクをいくつか挙げています。最終的には、各タイプの関連データが異なるため、実際の「SELECT *」は機能しない可能性があります。これは、各テーブルの補助情報が異なるためです。結果セットをどのように見せたいかを決める必要があります。その時点で、手作業でコードを作成することができます(またはコード生成/動的SQLをコードする可能性もあります)ので、スキーマの変更に伴うメンテナンスの問題は多少なりともなくなります。私は答えの一例を挙げます。 –

関連する問題