2011-08-19 47 views
4

我試圖做一個案件的查詢條件,看看我會顯示什麼列表,但我有這個錯誤ORA-01427: single-row subquery returns more than one rowSQL查詢與一個案件,當返回多個行

查詢是這樣的:

select 
CASE WHEN action_type like 'Trigger Severity' THEN (select cast(SEVERITY as varchar2(255)) name from SURV_TRIGGER_SEVERITY_LIST) 
    WHEN action_type like 'Host Group' then (select cast(name as varchar2(255)) name from Surv_List.groups) 
    WHEN action_type like 'Host' then (select cast(name as varchar2(255)) name from tn_tree) 
    END display_value 
from surv_action_type_list 
where id = 0 

是possibel調用查詢更多一行的情況下,條件裏面?

+0

你到底想幹什麼?哪個子查詢有多行,你想如何處理它? – chris

+0

Oracle是否真的允許您通過查詢另一個表中的列名來選擇在select語句中使用的列名? – hoodaticus

+0

所有的subquerys都返回多行。我想通過id選擇我向用戶展示的列表。 – macwadu

回答

2

我會在多個步驟做到這一點。獲取操作類型,然後發出適當的查詢。無論你是在前端還是在存儲過程中都有這個邏輯,你就可能會依賴於很多其他的東西。

如果你絕對需要做這種方式,那麼你可以嘗試這樣的事:

SELECT 
    SQ.display_value 
FROM 
    surv_action_type_list SATL 
INNER JOIN 
    (
    SELECT 
     'Trigger Severity' action_type, 
     CAST(severity AS VARCHAR2(255)) display_value 
    FROM 
     SURV_TRIGGER_SEVERITY_LIST 
    UNION ALL 
    SELECT 
     'Host Group' action_type, 
     CAST(name AS VARCHAR2(255) display_value 
    FROM 
     Surv_List.groups 
    UNION ALL 
    SELECT 
     'Host' action_type, 
     CAST(name AS VARCHAR2(255) display_value 
    FROM 
     tn_tree 
    ) SQ ON 
    SQ.action_type = SATL.action_type 
WHERE 
    SATL.id = 0 
+0

坦克,工作:) – macwadu

+0

很高興我可以幫助 –

0

您有3個子查詢。

1. select cast(SEVERITY as varchar2(255)) name from SURV_TRIGGER_SEVERITY_LIST 
2. select cast(name as varchar2(255)) name from Surv_List.groups 
3. select cast(name as varchar2(255)) name from tn_tree 

每一個必須返回0或1行,但不是更多。

+0

我明白了,那是因爲給我的錯誤。我問是否有解決方案來做到這一點? – macwadu

0

不可以。您的子查詢應該只返回一個值(只有一行和一列),因爲您將在單行中顯示它。

由於您使用上面的查詢將值顯示爲一列,所以您的意圖看起來像只有一個值。

select 
CASE WHEN action_type like 'Trigger Severity' THEN (select cast(SEVERITY as varchar2(255)) name from SURV_TRIGGER_SEVERITY_LIST) 
    WHEN action_type like 'Host Group' then (select cast(name as varchar2(255)) name from Surv_List.groups) 
    WHEN action_type like 'Host' then (select cast(name as varchar2(255)) name from tn_tree) 
    END display_value 
from surv_action_type_list 
where id = 0 

有沒有一個地方缺少的鏈接這個ID來說一個嚴重性列表? 通常查詢這樣會在子查詢的條件..像..

select 
    CASE WHEN action_type like 'Trigger Severity' 
      THEN (select cast(SEVERITY as varchar2(255)) name 
         **from SURV_TRIGGER_SEVERITY_LIST trglst 
         where trglst.name = lst.severity_name** 
    ----- 
    --- 

     END display_value 
    from surv_action_type_list lst 
    where id = 0 
+0

對不起,我沒有很好地解釋我自己,subquerys沒有任何關係的主要查詢。 – macwadu

+0

一小組樣本數據肯定會有所幫助。但是,對於你的問題的答案仍然是否定的,你不能從你的案例中的每個sql中獲取多行。 –