2016-08-23 64 views
0

多单联接表中选择数据我有一个回合20桌与像t00XX_b命名方案和相应的t00XX_b_results 我想要做的就是加入那些对做出一个选择对所有这些表添加数据到一个大表。对我来说,从逻辑上讲,它应该以这种方式工作:从没有完成

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 
. . . 

注:

  • 不要使用SELECT *,尤其是对UNION ALL操作。您应该明确列出列,特别是当表共享列名时。
  • 我更喜欢LEFT JOINRIGHT JOIN。语义更容易(“保留第一个表中的所有行”)
+0

噢,谢谢,我不知道'''是一个真正的操作符。这解释了很多。有了'UNION ALL',它就像一个魅力一样。我也会交换'*'选择器。非常感谢! –