从未完成的多个单个连接表中选择数据

时间:2016-08-23 07:40:03

标签: mysql sql

我有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 个答案:

答案 0 :(得分: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。语义更容易("保留第一个表中的所有行")