繁体   English   中英

使用子查询而不是表名

[英]using subquery instead of the tablename

Table Meta:
-------------------------------------
type                  tab_name
new                   tab_news
sports                tab_sps

Table tab_news
------
id

Table tab_sps
-------------------
id
xx

现在我想用

SELECT id 
  FROM (SELECT tab_name 
          FROM Meta 
         WHERE type = 'news');

但它不起作用,任何想法?

SQL不支持表名的变量/ etc - 支持你所要求的唯一方法是使用动态SQL:

FOR i IN (SELECT tab_name
            FROM META m
           WHERE m.type = ?) LOOP
  EXECUTE IMMEDIATE 'SELECT * FROM '|| i.tab_name ||'';
END LOOP;

您尝试使用的语法结构不能满足您的需求。 FROM子句中出现的是数据集。 这可能是表格或视图。 在您的情况下,数据集是“Meta”的子集; 特别是“tab_name”列,用于类型为“news”的行。

SELECT id 
  FROM (SELECT tab_name 
          FROM Meta 
         WHERE type = 'news');

SQL基本上是面向设置的。 您似乎希望“tab_name”返回“指针”或对数据集的引用。 这表明更加面向对象的方法。 从Meta中选择而不是table_name将返回对象的实例,并且包装器将使用该对象上的方法来提取细节。 那将更多

SELECT tab_name.getId()
FROM Meta
Where type = 'news';

但在尝试猜测对象结构可能是什么样之前,我需要对问题进行更多“业务术语”描述。

我不相信你想要实现的目标是可能的。 如果您正在使用带有此数据的编程语言,则可以先返回子查询值,然后为所需的查询构建新的SQL语句。 但是,在这样的SQL内部构建动态查询似乎不可能。

我认为您需要退一步看看您的数据库逻辑。 必须采用不同的方式来做到这一点。 例如,由于每个表必须具有相同的布局,因此您可以执行union all,然后将数据过滤到您真正想要的内容。 您可以在运行时使用子查询执行此操作。 如果它扩展到很多,那么该过程会产生很大的开销,但它可能会解决您的根本问题。 基本上,重新考虑你的设计。 有一种方法可以实现您的最终目标,但它不是沿着这条道路走下去的。

尝试别名子查询。

select * from  (select tab_name from Meta where type='news') as my_sub_query;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM