0

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

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

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

4

2 回答 2

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
  |   |

然后查询将返回:这 4 行的 Key1、Key2、Key3、None。

于 2013-06-25T17:39:05.600 回答
0

您的原始查询必须正常工作,也许数据中的某些东西可能是问题所在。假设表列是字符串,您可以尝试:

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) 

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

高温高压

于 2013-06-25T18:18:22.267 回答