【问题标题】:Select using dynamically generated tablename使用动态生成的表名选择
【发布时间】:2020-01-01 08:11:19
【问题描述】:

我遇到了以下问题。我的表(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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这应该是动态完成的:

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

    【讨论】:

    • 非常感谢。不过,我需要问一件事。如何放置此代码?在内部查询的开头?
    • 这应该是动态完成的!完成整个查询的唯一方法是通过存储过程
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多