【问题标题】:using subquery instead of the tablename使用子查询而不是表名
【发布时间】:2011-08-21 08:28:28
【问题描述】:
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');

但它不起作用,有什么想法吗?

【问题讨论】:

  • @OMG Ponies - OP 想要从 tab_news 表中获取所有数据。相反,OP 从 Meta 表中获取单条记录。
  • 您好,我更新了帖子,“BiggsTRC”是对的,我想获取 tab_news 表的记录。错误是“ora error:09004,invalid identifier "id");
  • @OMG Ponies - 是的,如果您想在设计时这样做。但是,OP 希望根据表中的值从不同的表中查找数据。例如,下次我们运行查询时,它可能会改为转到 tab_sps 表。 OP 希望查询在运行时根据数据库中的信息进行更改。
  • oracle支持动态sql吗?
  • @Conrad Frix:是的,Oracle 支持动态 SQL。详情见我的回答。

标签: sql oracle ora-00904


【解决方案1】:

您尝试使用的语法结构不能满足您的要求。 FROM 子句中出现的是一个数据集。这可能是一个表或一个视图。在您的情况下,数据集是“元”的子集;特别是“新闻”类型的行的“tab_name”列。

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';

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

【讨论】:

    【解决方案2】:

    SQL 不支持表名的变量/等——支持您所要求的唯一方法是使用动态 SQL:

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

    【讨论】:

    • ORA-00904 错误是因为您无法引用表或派生表/内联视图中不存在的列。
    【解决方案3】:

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

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

    【讨论】:

    • 是的,我以前试过这个,这就是我最终使用的方法。 SQL返回一个对象而不是纯文本字符串,我相信它的表名只接受纯文本
    【解决方案4】:

    尝试为子查询设置别名。

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

    【讨论】:

    • 那不会给出预期的结果。它仍然会仅列出 Meta 表中的一条记录,而不是 OP 想要的表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多