【问题标题】:SELECT query and sub-select query with dynamic table names带有动态表名的 SELECT 查询和子选择查询
【发布时间】:2012-10-28 17:45:45
【问题描述】:

我的 MySQL 数据库结构有一个有趣的情况。

假设我有三个数据库表:table_Main、table_sub_A、table_sub_B

“table_Main”字段:

  • 行ID
  • 代码(该字段用于查找“table_sub_”表
  • 姓名

“table_Main”行示例:

1,A,Test A
2,B,Test B

现在,我想构建一个 SQL 查询,该查询将检索 table_Main 中的所有行,同时还从每个 table_Main 行的相应表中获取 count(*)。

SELECT *, (SELECT COUNT(*) FROM table_sub_XXXX) AS TotalRecords  FROM table_Main

问题从这里开始。 XXXX 应该是每个对应 table_Main 行的“代码”列值。如何在子选择查询中生成动态表名?

感谢您的帮助。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你不能

    SELECT
       *,
       (SELECT COUNT(*) FROM table_sub_A) AS TotalRecordsA, 
       (SELECT COUNT(*) FROM table_sub_B) AS TotalRecordsB
    FROM
       table_Main
    

    但是,MySQL 可能会评估table_Main的每行

    所以我会这样做来帮助查询优化器

    SELECT
       *, TotalRecordsA, TotalRecordsB 
    FROM
       table_Main
       CROSS JOIN
       (SELECT COUNT(*) AS TotalRecordsA FROM table_sub_A) A
       CROSS JOIN
       (SELECT COUNT(*) AS TotalRecordsB FROM table_sub_B) B
    

    【讨论】:

    • 谢谢,但是根据 table_main 上的“代码”列,有 500 多个表链接到主表。因此,子选择查询的表名必须动态设置。有什么建议吗?
    • @Cem:不是真的。您必须通过查询 INFORMATION_SCHEMA.TABLES 来准备动态 SQL 语句。我把它留给你作为练习......
    猜你喜欢
    • 2019-08-27
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多