当我对输入参数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
答案 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
,但我没有告诉我们你的数据,所以我真的不知道。