Oracle SQL - оператор Case с итерацией - PullRequest
0 голосов
/ 04 февраля 2020

Значения таблицы ASCII должны сравниваться с s.manure_type. Для каждой записи в следующей таблице ниже оператор регистра КоличествоВ должен сделать сравнение. Значение, которое нужно выбрать, например: овес, бархатные бобы и др.

select                        
c.id customer_num,
c.type type, 
s.id_text sample_num,
c.sasa_grower_code s_grower,
c.address s_address1,
c.postalcode s_post_code,
c.email q1_email,
nvl(c.client_name, c.farm_name )s_company,
c.farm_name s_estate,
c.contact_name s_contact,
s.id_numeric id_numeric,
s.id_text fas_lab_id,
s.date_received received_date,
s.date_printed printed_date,
s.sampled_date sampled_date,
e.name S_AREA_DESCRIP,
a.name s_advisor_name,
a.email s_advisor_email,
s.order_no s_order_num,
s.field_name s_field,
p.phrase_text  || ' cm' sample_depth,
cr.crop_name s_crop,
s.attyield s_yield,
s.variety s_varty, 
case when s.flg_trashed is null then 
               'None'
             else (case when s.flg_trashed = constant_pkg.get_true  then 
                     'Yes'
                   else (case when s.flg_trashed = constant_pkg.get_false then 
                          'No'
                         else ' ' 
                         end)
                   end) end trashed,
case when s.flg_irrigated is null then 
               'None'
             else (case when s.flg_irrigated = constant_pkg.get_true then 
                     'Yes'
                   else (case when s.flg_irrigated = constant_pkg.get_false then 
                          'No'
                         else ' ' 
                         end)
                   end) end s_irrig,     
                   CASE
                        WHEN trim(s.manure_type) in (select p.phrase_id from phrase p where p.phrase_type = 'AL_G_MANUR') then (select p.phrase_text from phrase p)
                    END AS QuantityText,                  
'' S_GM_YIELD,
s.project_code project_code,
s.trial_ref trial_ref,
s.cost_centre cost_centre
from client c
left outer join sample s on (s.client_id = c.id)
left outer join extension e on (e.id = c.extension_id)
left outer join advisor a on (a.id = c.advisor_id)
left outer join phrase p on (p.phrase_id = s.depth)
left outer join crop cr on (cr.id = s.crop_id)
where p.phrase_type = phrase_pkg.get_soil_depth
and c.id =    '211493A'
and s.fas_sample_type =  sample_pkg.get_soil_sample
and s.flg_recommendation = sample_pkg.get_flg_recommendation
and s.id_numeric between   14932  and  14933
+----------------------------+
|           Phrase           |
+----------------------------+
|AL_G_MANUR  OA Oats         |
|AL_G_MANUR  V  Velvet Beans
|AL_G_MANUR  O  Other
|AL_G_MANUR  N  None         |
+----------------------------+

Но я получаю ошибку ORA-00900: запрос в одну строку возвращает более одной строки

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Проблема заключается в следующем утверждении

then (select p.phrase_text from phrase p)

Я думаю, его следует заменить на это

(select p.phrase_text from phrase p where p.phrase_type = 'AL_G_MANUR')
0 голосов
/ 04 февраля 2020

Отсутствие предложения where в одном из операторов case, скорее всего, является причиной.

CASE
  WHEN trim(s.manure_type) in 
      (select p.phrase_id from phrase p where p.phrase_type = 'AL_G_MANUR') 
    then (select p.phrase_text from phrase p) <<< NO WHERE CLAUSE ?
END AS QuantityText,                  

Это относительно легко отладить самостоятельно.

  1. Удалить один выбранный столбец
  2. Проверьте, по-прежнему ли возникает ошибка
  3. Если это произойдет, go вернитесь к 1.
  4. Если этого не произойдет, проверьте причину последних добавленных ошибок столбца
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...