2016-08-23 7 views
0

t00XX_bなどの名前付けスキームを持つbout20個のテーブルがあります。t00XX_b_results これらのペアをすべて結合して、データを1つの大きなテーブルに格納します。論理的には、私は論理的にこのように動作するはずです:複数の結合された複数のテーブルからデータを選択しない

SELECT 
    * 
FROM 
    (t0001_b AS t1 
    RIGHT JOIN t0001_b_results AS t2 ON t1.IndexResult = t2.IndexResult), /*generates ~20000 rows*/ 
    (t0002_b AS t3 
    RIGHT JOIN t0002_b_results AS t4 ON t3.IndexResult = t4.IndexResult), /*generates ~6000 rows*/ 
    ... 

しかし、私はテーブルをチェーンするとすぐにクエリは終了しません。私は、単一のテーブルのペアでクエリを実行する場合、それは完全に動作します。

この例では、正常に動作します:

SELECT 
    * 
FROM 
     (t0001_b AS t1 
     RIGHT JOIN t0001_b_results AS t2 ON t1.IndexResult = t2.IndexResult) 

私は間違いを見ることはできませんが、私は同様に、SQLの専門家ではありませんよ。 どうしたの?何かが間違った順序でありますか?

答えて

1

これが論理であるかどうかわかりませんが、質問は疑いなく正しいです。カンマは、デカルト積を作成するCROSS JOIN演算子です。

さらに、私の推測では、MySQLは各結合ペアを具体化する予定です。

私は実際にサンプルデータと望ましい結果なしで、具体的な提案をすることはできませんが、おそらくあなたはこれをしたい:

SELECT * 
FROM t0001_b t1 RIGHT JOIN 
    t0001_b_results t2 
    ON t1.IndexResult = t2.IndexResult 
UNION ALL 
SELECT * 
FROM t0002_b t3 
    t0002_b_results t4 
    ON t3.IndexResult = t4.IndexResult 
. . . 

注:

  • 特にUNION ALLため、SELECT *を使用しないでください。オペレーション。明示的に列をリストする必要があります(特に、表が列名を共有する場合)。
  • 私は大いに好むLEFT JOINからRIGHT JOINを好む。意味は簡単です(「最初のテーブルのすべての行を保持する」)
+0

おかげで、私は '、'が実際に演算子であることを知りませんでした。これはたくさん説明します。 'UNION ALL'では魅力的に機能します。 '*'セレクタも入れ替えます。どうもありがとう! –

関連する問題