【问题标题】:Query from multiple tables dynamically动态查询多个表
【发布时间】:2021-10-13 06:13:49
【问题描述】:

我想从数据库中查询一个存在于任一表中的对象。我不确定特定对象所属的表名。例如假设我的数据库由各种表组成,例如 Domestic_Passengers、Asian_Passengers、US_Passengers。并且这个表列表可能会增加,就像将来我们可能会添加 UK_Passengers 表一样。

所以,我想查询类似的东西

SELECT * FROM
(SELECT table_name FROM user_tables where table_name like '%PASSENGER')
WHERE NAME LIKE 'John%'

这可能吗?

【问题讨论】:

  • 我强烈建议您使用带有“区域”列的单个“乘客”表。然后,您可以创建“视图”,例如,按区域分隔权限。在不知道其名称的情况下查询表可能会变得混乱且不安全。
  • 数据库已在使用中。我只是举了一些例子。它是生产中的重型数据库。无法更改。
  • 创建一个包含所有表的union 的视图并针对它执行查询。无论如何,您不能使用select * 进行动态查询,因为每个表都有自己的结构。而且这个查询毫无意义
  • 你怎么知道在哪里加入表格?

标签: sql oracle join plsql


【解决方案1】:

这是一个非常糟糕的数据库设计。

我建议这样的观点:

CREATE OR REPLACE VIEW PASSENGERS AS
SELECT * FROM Domestic_Passengers
UNION ALL
SELECT * FROM Asian_Passengers
UNION ALL
SELECT * FROM US_Passengers;

然后从此视图中选择。

如果这不可行,那么您需要在 PL/SQL 包中运行动态 SQL。但这涉及到一些代码。

【讨论】:

    【解决方案2】:

    最佳答案取决于很多细节,例如是否可以创建数据库对象、表的静态程度以及如何使用此查询。

    如果你可以创建架构对象,并且表的列表有些稳定,那么构建视图的Wernfried's answer 可能是最好的。

    如果您可以创建模式对象,但表列表是非常动态的,并且您的应用程序可以理解引用游标,那么您可能应该创建一个函数来创建 SELECT 并通过引用游标返回它,就像在this answer 中一样。

    如果您无法创建模式对象,那么您将受限于 DBMS_XMLGEN/XMLTABLE 技巧。在单个查询中,为所需的 SELECT 语句构建一个字符串,通过 DBMS_XMLGEN 运行它以创建一个 XMLType,然后使用 XMLTABLE 将 XML 转换回行和列。这种方法既慢又难看,但它是在 SQL 中拥有动态 SQL 而无需创建任何自定义 PL/SQL 对象的唯一方法。例如,请参阅我的回答 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2022-12-10
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多