2012-11-08 84 views
0

我有一个关于我的MySQL数据库结构的有趣的情况。SELECT动态表名称查询和子选择查询

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

“table_Main” 字段:

  • ROWID
  • 代码(此字段用于寻找 “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行的“代码”列值。如何在子选择查询中生成动态表名?

感谢您的帮助。

回答

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 
+0

谢谢,但有500多个表基于table_main上的“代码”列链接到主表。因此,必须动态设置子选择查询上的表名。有什么建议么? – Cem

+0

@Cem:不是。您必须通过查询INFORMATION_SCHEMA.TABLES来准备动态SQL语句。我把这件事留给你做练习...... – gbn

+0

好的,谢谢。我会尝试这种方式。干杯。 – Cem