使用动态生成的表名选择

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用动态生成的表名选择相关的知识,希望对你有一定的参考价值。

我遇到以下问题。我的表(geo_table)的结构如下:

foreign_table_id | foreign_table_name | some_other_fields...

foreign_table_name存储不同表的名称,foreign_table_id存储这些表内的ID。我想做的是检查上述表中的行是否存储对其他表的有效引用。因此,我需要从外部表中选择一行,该行的名称基于foreign_table_name中存储的字符串。我的代码不起作用,因为它存在语法错误,但是清楚地表达了我想要实现的目标:

SELECT foreign_table_id, foreign_table_name FROM `geo_table` gt
WHERE (
    SELECT COUNT(*) FROM gt.foreign_table_name AS t
    WHERE gt.foreign_table_id = t.uid
) > 0
答案

如果知道所有可能的表名,则可以使用条件语法来实现它:

SELECT foreign_table_id, foreign_table_name FROM `geo_table` gt
WHERE 
    CASE gt.foreign_table_name
        WHEN 'table1' THEN 
            EXISTS (
                SELECT * FROM table1
                WHERE id = gt.foreign_table_id
            )
        WHEN 'table2' THEN 
            EXISTS (
                SELECT * FROM table2
                WHERE id = gt.foreign_table_id
            )
        ELSE
            FALSE
    END
另一答案

这应该动态完成:

declare @tablename varchar(50)
set @tablename = 'test'
declare @sql varchar(500)
set @sql = 'select * from ' + @tablename
exec @sql 

以上是关于使用动态生成的表名选择的主要内容,如果未能解决你的问题,请参考以下文章

动态表名称生成导致“找不到表”

sql server存储过程如何动态生成表名

使用子选择选择 FROM 表并修改生成的表名

mysql中查询语句的表名,是不是可以动态选择表名像这样

mysql 从动态表名中查询数据

创建这个动态生成的表时我做错了啥?