使用子查询代替表名

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

Table tab_news
------
id

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

Now I want to use

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

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

@OMG Ponies - OP想要从tab_news表中获取所有数据。但是,OP却得到了Meta表中的单个记录。 - IAmTimCorey
嗨,我更新了帖子,“BiggsTRC”是正确的,我想获取tab_news表的记录。错误是“ora error:09004,无效标识符“id”)。” - zhanjian
@OMG Ponies - 是的,如果你想在设计时完成这个操作是可以的。然而,原帖中的问题是基于表中的某个值来查找不同表中的数据。例如,下一次运行查询时,可能需要去tab_sps表中查找。原帖中的问题是希望查询能够根据数据库中的信息在运行时进行动态变化。 - IAmTimCorey
Oracle支持动态SQL吗? - Conrad Frix
@Conrad Frix:是的,Oracle支持动态SQL。有关详细信息,请参阅我的答案。 - OMG Ponies
所以这个设置是为了让你可以更改“新闻”类型的实际表名?为什么需要这种抽象?为什么不直接查询NEWS表?除非这是作业,否则尽量保持简单。另外,Oracle会很乐意为您存储有关NEWS表或任何其他创建的对象的元数据;) - tbone
4个回答

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 错误是因为您不能引用表或派生表/内联视图中不存在的列。 - OMG Ponies

2
你试图使用的语法结构并不能实现你想要的功能。 在 FROM 子句中,出现的是一个数据集合。这个数据集合可以是一个表格或视图。在你的情况下,这个数据集合是 "Meta" 的子集,具体来说是类型为 "news" 的行所对应的 "tab_name" 列。
SELECT id 
  FROM (SELECT tab_name 
          FROM Meta 
         WHERE type = 'news');

SQL基本上是面向集合的。您似乎希望“tab_name”返回对数据集的“指针”或引用。这表明更多的是面向对象的方法。与表名不同,从Meta中选择会返回对象的实例,并且包装器将使用该对象上的方法来提取详细信息。那将更多地

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

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


0

我不相信你试图实现的目标是可能的。如果你正在使用一种编程语言处理这些数据,你可以先返回子查询值,然后为你想要的查询构建一个新的SQL语句。然而,在SQL内部构建这样的动态查询似乎是不可能的。

我认为你需要退一步,看看你的数据库逻辑。一定有一种不同的方法来做到这一点。例如,由于每个表必须具有相同的布局,也许你可以执行union all,然后过滤数据以仅获取你真正想要的数据。你可以在运行时使用子查询来完成这个过程。如果它扩展到很大规模,这个过程将会有很大的开销,但它可能解决你的根本问题。基本上,重新思考你的设计。有一种方法可以实现你的最终目标,但它不是通过这条路实现的。


是的,我以前尝试过这个方法,这就是我最终采用的方法。SQL返回的是一个对象,而不是纯文本字符串,我认为表名只接受纯文本。 - Atticus

-1
尝试给子查询取别名。
select * from  (select tab_name from Meta where type='news') as my_sub_query;

那样做不会得到期望的结果。它仍然只会列出Meta表中的一个记录,而不是OP想要的表。 - IAmTimCorey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接