繁体   English   中英

从多个模式拥有的多个表中选择数据

[英]Select data from multiple tables owned by multiple schemas

SQL的技能有限,请耐心等待:-)

我有一个具有多个架构的Oracle数据库,大多数包含一个名为C_USERNAMES的表。

我希望编写一个查询,该查询仅查询包含名为C_USERNAMES的表的架构,并基于一个或多个列数据返回行。

我可以从SYS帐户运行它。

理想情况下,我想将数据作为表单的单个格式的报表返回(假设NameAddressC_USERNAMES表中的列名):

Schema   Name   Address
-----------------------
SCH001   Dave   Station Road
SCH006   Paul   Main Ave
etc

我知道我需要某种嵌套查询或join / union,但是我无法解决任何使它起作用的问题。 我希望查询很聪明,因为它可以确定哪些模式包含表C_USERNAMES。

感谢您的指导,如果这是一个基本问题,请原谅我。

这整个设置使我感到恐惧。 您永远不应将查询作为SYS运行。 对SQL的了解有限的人都​​不应靠近SYS 将表包含在不同的架构中,这些表格包含您希望在单个查询中组合在一起的信息,这意味着存在严重的规范化问题。 而拥有有限的SQL技能的人构建动态SQL只会增加一系列问题。

也就是说,您可以使用动态SQL来构造所需的查询。 这样的事情可能接近您想要的。

CREATE OR REPLACE FUNCTION get_all_usernames
  RETURN sys_refcursor
IS
  l_sql VARCHAR2(4000);
  l_rc  SYS_REFCURSOR;
BEGIN
  FOR t IN (SELECT t.*,
                   rank() over (order by owner) rnk
              FROM dba_tables t
             WHERE table_name = 'C_USERNAMES'
             ORDER BY owner)
  LOOP
    IF( t.rnk = 1 )
    THEN
      l_sql := 'SELECT name, address FROM ' ||
               t.owner || '.c_usernames';
    ELSE 
      l_sql := l_sql ||
               ' UNION ALL ' ||
               'SELECT name, address FROM ' ||
               t.owner || '.c_usernames';
    END IF;
  END LOOP;

  OPEN l_rc 
   FOR l_sql;

  RETURN l_rc;
END;

暂无
暂无

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

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