我有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的专家。 怎么了?是否存在错误的订单?
答案 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 JOIN
到RIGHT JOIN
。语义更容易("保留第一个表中的所有行")