Использование CASE как части dblink для получения данных - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь использовать CASE для возврата значения из ссылки dblink с подзапросом. Тем не менее, результаты не отображают то, что я ожидал. Вместо того, чтобы проходить через каждый WHEN, он возвращает значение из первого WHEN (даже если он не соответствует критериям). Я уверен, что это как-то связано с тем, как я использую CASE с подзапросом.

Я выполнил подзапрос самостоятельно, и он возвращает ожидаемые результаты.

select su.shp_filter as "User_Type", su.shp_access_id as "RAD_ID", su.shp_name as "User_Name", rg.rad_stu_level as "Student_Level",
case
    when su.shp_filter = 'STU' then 
        case
            when rgd.rad_goal_value like 'HP%' then 'HP'
            when rgd.rad_goal_value like 'AS%' then 'AS'
            when rgd.rad_goal_value like 'BU%' then 'BU'
            when rgd.rad_goal_value like 'ED%' then 'ED'
            when rgd.rad_goal_value like 'TE%' then 'TE'
            when rgd.rad_goal_value like 'UN%' then 'UN'
            when rgd.rad_goal_value like 'KE%' then 'KE'
            when rgd.rad_goal_value like 'PH%' then 'PH'
            when rgd.rad_goal_value like 'OP%' then 'OP'
            when rgd.rad_goal_value like 'CP%' then 'CP'
        end
    when su.shp_filter in ('ADV','REG','DEAN','DEPT','ATHL') then
        case
            when exists (select pebempl.pebempl_orgn_code_home, su.shp_access_id, spriden.spriden_id from pebempl@dblink pebempl
            join spriden@gold.ferris.edu spriden
            on pebempl.pebempl_pidm=spriden.spriden_pidm
            join DWSCHEMA.SHP_USER_MST su
            on substr(su.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8)
            where spriden.spriden_change_ind is null
            and pebempl.pebempl_orgn_code_home like '11%') then 'Office 1'
            when exists (select pebempl.pebempl_orgn_code_home, su.shp_access_id, spriden.spriden_id from pebempl@dblink pebempl
            join spriden@gold.ferris.edu spriden
            on pebempl.pebempl_pidm=spriden.spriden_pidm
            join DWSCHEMA.SHP_USER_MST su
            on substr(su.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8)
            where spriden.spriden_change_ind is null
            and pebempl.pebempl_orgn_code_home like '21%') then 'Office 2'
            when exists (select pebempl.pebempl_orgn_code_home, su.shp_access_id, spriden.spriden_id from pebempl@dblink pebempl
            join spriden@gold.ferris.edu spriden
            on pebempl.pebempl_pidm=spriden.spriden_pidm
            join DWSCHEMA.SHP_USER_MST su
            on substr(su.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8)
            where spriden.spriden_change_ind is null
            and pebempl.pebempl_orgn_code_home like '22%') then 'Office 3'
            when exists (select pebempl.pebempl_orgn_code_home, su.shp_access_id, spriden.spriden_id from pebempl@dblink pebempl
            join spriden@gold.ferris.edu spriden
            on pebempl.pebempl_pidm=spriden.spriden_pidm
            join DWSCHEMA.SHP_USER_MST su
            on substr(su.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8)
            where spriden.spriden_change_ind is null
            and pebempl.pebempl_orgn_code_home like '31%') then 'Academic Affairs'
end "College"

1 Ответ

0 голосов
/ 07 января 2019

О - я думаю, я вижу вашу проблему. Ваши подзапросы exists вообще не присоединены к вашему внешнему запросу, поэтому они всегда возвращают сотни строк. Это будет более понятно, если вы переименуете каждый экземпляр SHP_USER_MST в su1, su2, su3 и т. Д .:

when su.shp_filter in ('ADV','REG','DEAN','DEPT','ATHL') then
    case
        when exists (select pebempl.pebempl_orgn_code_home, su1.shp_access_id, spriden.spriden_id from pebempl@dblink pebempl
            join spriden@gold.ferris.edu spriden
            on pebempl.pebempl_pidm=spriden.spriden_pidm
            join DWSCHEMA.SHP_USER_MST su1 
            on substr(su1.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8)
            where spriden.spriden_change_ind is null
            and pebempl.pebempl_orgn_code_home like '11%') then 'Office 1'
        when exists (select pebempl.pebempl_orgn_code_home, su2.shp_access_id, spriden.spriden_id from pebempl@dblink pebempl
            join spriden@gold.ferris.edu spriden
            on pebempl.pebempl_pidm=spriden.spriden_pidm
            join DWSCHEMA.SHP_USER_MST su2 
            on substr(su2.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8)
            where spriden.spriden_change_ind is null
            and pebempl.pebempl_orgn_code_home like '21%') then 'Office 2'

Если вы посмотрите здесь, ничто в подзапросе не ссылается на текущую строку в su - поэтому вы проверяете, есть ли ЛЮБЫЕ пользователи в вашем подзапросе. И они всегда так делают, поэтому он всегда возвращает «Офис 1».

Я думаю, вы хотите что-то более похожее на

when su.shp_filter in ('ADV','REG','DEAN','DEPT','ATHL') then
    case
        when exists (select pebempl.pebempl_orgn_code_home, su.shp_access_id, spriden.spriden_id from pebempl@dblink pebempl
            join spriden@gold.ferris.edu spriden
            on pebempl.pebempl_pidm=spriden.spriden_pidm
            where spriden.spriden_change_ind is null
            and substr(su.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8) -- Link subquery to outer query
            and pebempl.pebempl_orgn_code_home like '11%') then 'Office 1'
        when exists (select pebempl.pebempl_orgn_code_home, su.shp_access_id, spriden.spriden_id from pebempl@dblink pebempl
            join spriden@gold.ferris.edu spriden
            on pebempl.pebempl_pidm=spriden.spriden_pidm
            where spriden.spriden_change_ind is null
            and substr(su.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8) -- Link subquery to outer query
            and pebempl.pebempl_orgn_code_home like '21%') then 'Office 2'
...etc

Я думаю, что это должно сработать для вас, но в качестве дополнительного предложения, я думаю, вы могли бы также переписать этот раздел, чтобы он был немного более эффективным и читабельным.

case (select substr(min(pebempl.pebempl_orgn_code_home),1,2) from pebempl@dblink pebempl
        join spriden@gold.ferris.edu spriden
        on pebempl.pebempl_pidm=spriden.spriden_pidm
        where spriden.spriden_change_ind is null
        and substr(su.shp_access_id,1,8) = substr(spriden.SPRIDEN_ID,1,8))
    when '11' then 'Office 1'
    when '21' then 'Office 2'
    when '22' then 'Office 3'
    when '31' then 'Academic Affairs'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...