2011-08-19 67 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中获取多行。 –