想象一下,我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)中执行此操作吗?
答案 0 :(得分:2)
你唯一的机会就是做两个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
等