sql запрос с регистром при возврате более одной строки - PullRequest
4 голосов
/ 19 августа 2011

Я пытаюсь сделать запрос со случаем, когда условие, чтобы увидеть, какой список я покажу, но у меня эта ошибка ORA-01427: single-row subquery returns more than one row.

запрос такой:

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

возможно ли вызвать запрос с более чем одной строкой в ​​условии case?

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

Я бы сделал это в несколько шагов.Получите тип действия, затем выполните соответствующий запрос.Независимо от того, есть ли у вас эта логика во внешнем интерфейсе или в хранимой процедуре, это зависит от вас и, вероятно, зависит от многих других вещей.

Если вам абсолютно необходимо сделать это таким образом, вы можете попробовать что-то подобное:

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 голосов
/ 19 августа 2011

Нет. Ваш подзапрос должен возвращать только одно значение (только одну строку и один столбец), поскольку вы будете отображать его в одной строке.

Поскольку вы отображаете значение в виде одного столбца, используя свой запрос выше, похоже, вы намереваетесь получить только одно значение.

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

Есть ли где-нибудь отсутствующий, который связывает этот идентификатор, чтобы сказать список серьезности? Обычно такие запросы имеют условие в подзапросе .. что-то вроде ..

 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 голосов
/ 19 августа 2011

У вас есть 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 ряд, но не более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...