当返回2个输出值时,它应显示硬编号,如果返回1个输出值,则应显示1输出本身

时间:2017-04-15 12:28:55

标签: sql oracle set-operations

当我对输入参数ABC执行查询时,它返回两个值(Partner, Smith);每当返回这两个值的两个值时,Smith将是一个必须返回的值。

但是,只要使用输入参数'xyz'执行相同的查询,它就只返回一个值。

现在我的要求是每当我执行查询时,如果它返回这两个值的两个值,则只有SMITH必须在输出中返回,如果同一查询返回一个输出值,那么它应该显示loutput值本身。

以下查询满足我的要求的第一部分,但它不符合我要求的第二部分。每当输出值数量为1时,它不会显示1output值,而是返回'Null'值。

SELECT R.REGION_GID 
FROM GTM_TRANSACTION T, 
     GTM_TRANSACTION_INVOLVED_PARTY P,
     CONTACT C, 
     LOCATION L,
     REGION_DETAIL R 
WHERE T.GTM_TRANSACTION_GID=P.GTM_TRANSACTION_GID 
AND R.COUNTRY_CODE3_GID = L.COUNTRY_CODE3_GID 
AND R.REGION_GID LIKE 'SSN/BP.GTM_COMPL%' 
AND L.LOCATION_GID = C.LOCATION_GID 
AND P.INVOLVED_PARTY_CONTACT_GID=C.CONTACT_GID
AND P.INVOLVED_PARTY_QUAL_GID='SHIP_FROM' 
AND T.GTM_TRANSACTION_GID=$SHIP_FORM 

INTERSECT

SELECT R.REGION_GID 
FROM GTM_TRANSACTION T,
     GTM_TRANSACTION_INVOLVED_PARTY P,
     CONTACT C,
     LOCATION L,
     REGION_DETAIL R 
    WHERE T.GTM_TRANSACTION_GID=P.GTM_TRANSACTION_GID
     AND R.COUNTRY_CODE3_GID = L.COUNTRY_CODE3_GID
      AND R.REGION_GID ='SSN/BP.GTM_COMPL_NO_CODING' 
    AND L.LOCATION_GID = C.LOCATION_GID  
    AND P.INVOLVED_PARTY_CONTACT_GID=C.CONTACT_GID 
    AND P.INVOLVED_PARTY_QUAL_GID='SHIP_FROM'
      AND T.GTM_TRANSACTION_GID=$SHIP_FROM

1 个答案:

答案 0 :(得分:0)

据我所知,INTERSECT的两半之间的唯一区别在于P.REGION_GID的过滤器。上半场有:

R.REGION_GID LIKE 'SSN/BP.GTM_COMPL%'

而第二个

R.REGION_GID = 'SSN/BP.GTM_COMPL_NO_CODING'

鉴于INTERSECT如何运作,我认为这意味着前半部分是多余的。那么唯一的问题是后半部分是返回一行还是两行。您希望它始终返回一行,“SMITH”优先。以下逻辑可能是你想要的(作为奖励,我也整理了你的JOIN):

SELECT TOP 1
    R.REGION_GID
FROM
    GTM_TRANSACTION T
    JOIN GTM_TRANSACTION_INVOLVED_PARTY P ON
        T.GTM_TRANSACTION_GID=P.GTM_TRANSACTION_GID
    JOIN CONTACT C ON
        P.INVOLVED_PARTY_CONTACT_GID=C.CONTACT_GID
    JOIN LOCATION L ON
        L.LOCATION_GID = C.LOCATION_GID 
    JOIN REGION_DETAIL R ON
        R.COUNTRY_CODE3_GID = L.COUNTRY_CODE3_GID 
WHERE
    R.REGION_GID ='SSN/BP.GTM_COMPL_NO_CODING'
    AND P.INVOLVED_PARTY_QUAL_GID='SHIP_FROM'
    AND T.GTM_TRANSACTION_GID=$SHIP_FROM
ORDER BY
    CASE WHEN R.REGION_GID = 'SMITH' then 1 else 2 end

最后一行希望是:CASE WHEN R.REGION_GID = 'SMITH' then 1 else 2 end,但我没有告诉我们你的数据,所以我真的不知道。