2013-06-25 42 views
0

我有一個數據庫表中包含3個外鍵到另一個表(這三個表名是:manager,worker和employee)。在每一行中只有一個外鍵被填充。我需要寫一個查詢,注意哪個列的fk被填入where子句指定的條件執行。 我寫簡單的查詢在JPA,但不能正常工作在樹狀況下的一個查詢

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

你有什麼想法?我要解決這個問題,但我沒有任何想法

+0

你能說清楚你想要的輸出是什麼嗎?即你是否想要一個表示這條記錄與哪個表相關聯的列? – ChrisProsser

回答

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

然後查詢將返回:密鑰1,密鑰2,密鑰3,無,這4行。

+0

謝謝親愛的chris.can你幫我怎麼寫我的查詢到你的格式 –

+0

'none','key1','key2','key3'是什麼? –

+0

嗨,'沒有','key1','key2'和'key3'就是我給出的標籤。解碼的語法是解碼(表達式,搜索,結果[,搜索,結果] ... [,默認])請參閱http://www.techonthenet.com/oracle/functions/decode.php瞭解更多詳情。如果你讓我知道表的名稱,列和你想要返回的文本,如果它是col a,b或c,我可以更新這個例子。 – ChrisProsser

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而不是名字。

HTH

+0

謝謝你的answer.my查詢是我的問題的例子。我不設置varchar value.my問題是我有3條件,在數據庫中的每一行發生了一例 –

+0

我需要選擇所有這些排序中的任何一行都會引起它 –