如果存在则从表中选择,否则从oracle中的另一个表中选择

Posted

技术标签:

【中文标题】如果存在则从表中选择,否则从oracle中的另一个表中选择【英文标题】:select from a table if exist otherwise select from another in oracle 【发布时间】:2018-11-05 10:57:59 【问题描述】:

我有多个表,我从中选择列 示例:

select a.name, b.accno, c.bal
from tableA a, tableB b, tableC c
where a.id = d.id and a.id = c.id and a.accno ='12'

问题是 tableC 在我的架构中可能不可用。 因此,我想检查 tableC 是否可用,否则它应该在 tableA 中使用 a.bal。

请问如何构造我的选择查询来实现这一点。 问候,

【问题讨论】:

你没有。您编写 PL/SQL 来检查表是否存在,如果存在则执行一个查询,如果不存在则执行不同的查询。 (您可以在谷歌上搜索您喜欢如何进行检查,有几个选项。当您使用它时,请学习明确的 JOIN 语法,而不是使用 , 的隐式连接。 JOIN 语法已经有 20 多年的历史了,但人们仍然坚持教更古老的 , 语法:(这让我很伤心...) 这听起来很像一个非常非常糟糕的数据库设计。为什么会缺一张桌子?为什么可以换成别的?表格应该代表实体,比如产品、客户、订单。您永远不会查找 products 表,发现它不存在(到底是什么?)然后从 customers 表中选择。您可能想问另一个问题,关于如何让您的数据库变得正确。 我和 MatBailie 在这里。无论哪本书、教程或老师告诉您使用逗号分隔的连接,都将其关闭。 感谢您对此的专业回复。同时,我实际上在寻找连接到两个不同数据库实例的解决方法。我们目前必须在两个不同位置的数据库中使用不同的数据库结构但相同的字段结果。因此,我只是在寻找我不能根据位置在两个数据库之间切换的最佳方式。 @AfeezOlawale - 没关系。查询无法执行您想要的操作。只有当它引用的所有内容都实际存在时,查询才会执行。您必须要么查看不同的数据库结构(表或视图等始终存在,你说这不是一个选项),要么有两个不同的查询,并运行测试以查看应该执行哪个查询。 【参考方案1】:

我建议您的一种解决方法是:

SELECT a.name, 
       b.accno, 
       fn_Bal(a.id, a.bal) as bal
  FROM tableA a 
  JOIN tableB b ON a.id = b.id 
 WHERE a.accno ='12';

使用函数处理“表或视图不存在”异常:

create or replace function fn_bal(a_id in tableA.Id%TYPE,
                                  a_bal in tableA.bal%TYPE)
       return tableA.Bal%TYPE as

   table_does_not_exist exception;
   PRAGMA EXCEPTION_INIT(table_does_not_exist, -942);

   c_bal tableA.Bal%TYPE;

begin

  execute immediate
     'select bal
        from tableC
       where id = :1'
     into c_bal    
    using a_id;

   return c_bal;

exception
  when table_does_not_exist then
     return a_bal;
end;

【讨论】:

以上是关于如果存在则从表中选择,否则从oracle中的另一个表中选择的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择

Redshift:如果值存在,则从表 1 中获取值,否则从表 2 中提取

如果值存在于多个表中,则从表中获取结果

如果存在表 B,则从表 B 中获取数据,否则保留表 A(在某些列之后)

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

如果当前表中不存在,则从其他表中选择行