SQL:如何在table1中的字段中给出的表上创建table1 JOIN table2?

时间:2010-11-12 12:53:58

标签: mysql sql dynamic-sql

想象一下,我table1有一个名为'table_name'的列。我使用table1。table_name来存储数据库中另一个表的名称。可引用表都有一个字段'target_id。

是否可以在JOIN语句中使用table_name?

例如:

SELECT t1.*, t2.* FROM table1 AS t1
                  JOIN table1.table_name AS t2 ON t1.table1_id = t2.target_id

显而易见的解决方案是使用脚本(在我的例子中为C ++)首先获取表名,然后从中构造SQL查询。问题是:我们可以绕过脚本并直接在SQL(MySQL)中执行此操作吗?

修改:What is dynamic SQL?

2 个答案:

答案 0 :(得分:2)

你唯一的机会就是做两个SQL语句:

  • 选择您需要的表名
  • 使用此表名来动态构建secound查询以获取所需的数据 - 您想要的是不能直接使用SQL(并且听起来您在某种程度上设计了数据库错误 - 但是如果不知道它的目标是什么,那很难说。)

答案 1 :(得分:0)

我知道我迟到了,但我想提供一个不同的解决方案。我在审计表中看到了很多这样的事情。列table_name将引用“更改了哪个表”,table1_id将引用该表中更改的行的ID。在这种情况下,审计表指向许多通常不会加入的不同表。

这里是:

SELECT t1.*, t2.*, t3.*, t4.*, t5.*

FROM table1 AS t1

left JOIN table2 AS t2 
    ON t1.table1_id = t2.target_id
    and t1.table_name = 'table2'

left JOIN table3 AS t3
    ON t1.table1_id = t3.target_id
    and t1.table_name = 'table3'

left JOIN table4 AS t4 
    ON t1.table1_id = t4.target_id
    and t1.table_name = 'table4'

left JOIN table5 AS t5 
    ON t1.table1_id = t5.target_id
    and t1.table_name = 'table5'

当然,主要的缺点是可能引用的每个表都需要显式包含在SQL命令中。

您可以使用此作为选择列表获得更优雅的输出:

SELECT 
     t1.*, 
     coalesce(t2.fieldA, t3.fieldA, t4.fieldA, t5.fieldA) as fieldA,
     coalesce(t2.fieldB, t3.fieldB, t4.fieldB, t5.fieldB) as fieldB