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

标签 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 专家。 怎么了?是不是顺序错了?

最佳答案

我不知道这是否是您想要的逻辑,但您的查询可能是正确的。逗号是创建笛卡尔积的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操作。您应该明确列出列,特别是当表共享列名称时。
  • RIGHT JOIN相比,我更喜欢LEFT JOIN。语义更简单(“将所有行保留在第一个表中”)

关于mysql - 从多个单个连接表中选择数据未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39095156/

相关文章:

php - 为 'item' 表创建一个(复合)主键,其中增量 'item_id' 根据 'order_id' 外键重置

mysql - 需要帮助编写需要表连接的查询

mysql - 使用 Case 语句计算 MYSQL 中子字符串出现的次数

mysql - MySQL中的 `uint4korr`是什么意思?

java - 像语法、设计模式一样解析 SQL

sql - 计算ssis中两个日期之间的时差

mysql - 如何将一个表左连接n次?如果可能的话,使用 ZendDb?

python - Django:当我尝试从管理员创建用户时出现操作错误

sql - 如何替换SQL表中的NULL值?

java - 使用 JDBCCategoryDataset 折线图中的多个系列问题