2017-08-14 9 views
0

3番目のIDに基づいて2つのテーブルをマージすることについて、同様の投稿が多数見つかりましたが、ロジックを解決できないようです。mysqlは3番目のIDに基づく2つのテーブルのビューを作成します

付け 3つのテーブル

tableA

| uuid | ttl | ord | 
----------------------- 
| alpha| Alp |  1| 
| beta| Bet |  2| 
| gamma| Gam |  3| 

tableB

| uuid | ttl | ord | tab_A_ref 
-------------------------------- 
| joe | Jo |  1| alpha 
| mike | Mi |  2| beta 
| peter| Pe |  3| alpha 
| alan | Pe |  4| beta 
| tom | Pe |  5| gamma 

tableC

| uuid | ttl | ord | tab_A_ref 
-------------------------------- 
| jane | Ja |  1| alpha 
| marg | Ma |  2| beta 
| phobe | Ph |  3| alpha 
| anon | An |  4| beta 
| toni | To |  5| gamma 

私は2

SELECT 
     tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref, 
     tableC.uuid, tableC.ttl, tableC.ord, tableC.tab_A_ref, 
FROM 
     tableB INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid, 
     tableC INNER JOIN tableA on tableC.tab_A_ref = tableA.uuid 

をマージするためのロジックを拡張それが発生し、ビューの基本は、結合を使用して myViewtab_A_ref = alpha or beta

| uuid | ttl | ord | tab_A_ref 
| joe | Jo |  1| alpha 
| peter | Pe |  3| alpha 
| jane | Ja |  1| alpha 
| phobe | Ph |  3| alpha 
| mike | Mi |  2| beta 
| alan | Pe |  4| beta 
| marg | Ma |  2| beta 
| anon | An |  4| beta 

を作成するために

SELECT 
    tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref 
    FROM tableB 
    INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid 

を探していますエラーnot unique table/alias: tableA

他の投稿からは、入れ子になっている必要があります。bracketed JOIN、多数の組み合わせを試してみました。では、どのようにフォーマットするのですか?JOIN

+0

あなたは誤って 'JOIN'を使用しています。最後の行は' INNER JOIN tableC ON ... 'でなければならず、カンマはあらかじめ – RealCheeseLord

+0

のデータ構造がひどく非正規化されています。なぜテーブルBとCは同じフィールドを持っていますか?確かに彼らは1つのテーブルになるはずですか?それらが同じであるがプロパティが少し異なる場合(例えば、男性の名前と女性の名前があるように見える場合)、区別をつけるための余分な列があればよいでしょう。 – ADyson

+0

tableBとtableCのすべての行がtableBにちょうど入っていた場合、クエリは(アルファベット/ベータの制限を含む)単純に 'SELECT tableB.uuid、tableB.ttl、tableB.ord、tableB.tab_A_ref FROM tableB INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid tableA.uuid in( 'アルファ'、 'ベータ') ' – ADyson

答えて

2

すべてのテーブル(テンポラリ、サブクエリ、物理またはその他)は、クエリで一意に指定する必要があります。

それ以外の場合、データベースエンジンは参照しているデータの元がわかりません。

あなたの元:上記で

SELECT 
     tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref, 
     tableC.uuid, tableC.ttl, tableC.ord, tableC.tab_A_ref, 
FROM 
     tableB INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid, 
     tableC INNER JOIN tableA on tableC.tab_A_ref = tableA.uuid 

、どのようにクエリエンジンが使用するtableA知っていますか?あなたはそれを二度宣言しました。フィルタ(ON tableB.tab_A_ref = tableA.uuid)を適用していることを覚えておいてください。結果セットが2つあります(1つは最初の結合から、もう1つは2つめの組み合わせです)、両方ともtableAと呼ばれています。

SELECT 
     tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref, 
     tableC.uuid, tableC.ttl, tableC.ord, tableC.tab_A_ref, 
FROM 
     tableB INNER JOIN tableA AS a_ref ON tableB.tab_A_ref = a_ref.uuid, 
     tableC INNER JOIN tableA AS b_ref ON tableC.tab_A_ref = b_ref.uuid 
+0

確かに' FROM テーブルB INNER JOIN tableA AS a_ref on tableB.tab_A_ref = a_ref、 INNER JOIN tableC ON tableC.tab_A_ref = tableA.uuid'? – ADyson

+0

@ADyson - 達成しようとしていることに依存します。 (私は希望の出力がOPから決定するのが難しいと思っています...しかし、私はそれが "投げられている"エラーを "修正する"と確信しています)。つまり、どちらのテーブルでもテーブルAに一致するレコードがあるtableBからtableCまでのすべてのものを結合します。構文的には、これは有効です(テストしないと) - しかし、私は同意しません。コンテキスト(実際にOPが期待しているものを提供していない可能性があります)。 – wally

+1

また、上記のように、データ構造が少し標準化されていて、必要以上に複雑になっているようです。 – ADyson

0

以下JOINロジックが正しくない:

単純に、一意(そうでなければ接合または)すべてのテーブルを参照するエイリアス(AS)を使用

tableB INNER JOIN tableA on tableB.tab_A_ref = tableA.uuid, 
    tableC INNER JOIN tableA on tableC.tab_A_ref = tableA.uuid 

クエリは次のようになります

SELECT 
    tableB.uuid, tableB.ttl, tableB.ord, tableB.tab_A_ref 
FROM tableB 
    INNER JOIN tableA 
      ON tableB.tab_A_ref = tableA.uuid 
    INNER JOIN tableC 
      ON tableC.tab_A_ref = tableA.uuid 


ここで使用されるロジックの本質は、最初のJOINが、すでにというユニットを作成しており、必要に応じて他のテーブルと結合できることです。tableAはすでにJOINに入っていますが、特別な必要がない限り(ここではそうではないようですが)、クエリで再度指定する必要はありません。

関連する問題