树状况下的一个查询

时间:2013-06-25 17:33:21

标签: java oracle

我在数据库中有一个表,其中包含3个外键到另一个表(这三个表的名称是:manager,worker和employee)。在每一行中只填充一个外键。我需要编写一个查询,注意在执行子句指定条件的地方填充fk的哪一列。 我在jpa中编写简单查询但无法正常工作

 select b 
 from allEmployees b 
 where b.manager.name= :name 
    OR b.worker.name = :name 
   OR b.employee.name= :name 

你有什么想法吗?我必须解决它,但我不知道

2 个答案:

答案 0 :(得分:1)

听起来你可以使用嵌套解码,例如如果列名是a,b和c,则查询将是;

select decode(a,null,decode(b,null,decode(c,null,'None','Key3'),'Key2'),'Key1') as result from table

例如,如果您的表格如下所示:

A | B | C
----------
x |   |
  | x |
  |   | x
  |   |

然后查询将返回:Key1,Key2,Key3,None为4行。

答案 1 :(得分:0)

您的原始查询必须正常工作,数据中的某些内容可能是问题所在。假设表列是String,您可以尝试:

select b 
  from allEmployees b 
  where upper(b.manager.name) = upper(:name) 
  OR upper(b.worker.name) = upper(:name) 
  OR upper(b.employee.name) = upper(:name) 

另一种方法是使用集合操作:

select b 
  from allEmployees b 
  where upper(b.manager.name) = upper(:name) 
UNION
select b 
  from allEmployees b 
  where upper(b.worker.name) = upper(:name) 
UNION
select b 
  from allEmployees b 
  where upper(b.employee.name) = upper(:name) 

另一方面,这可能是一个设计错误,想想如果经理和员工的名字相同会发生什么,你也必须检查规范化,最好是用主键代替名字。< / p>

HTH