Reputation: 298
I am trying to return "Y" if the ContractID in SC appears in AT_TMP_, and "N" if it does not.
Here is my current code - currently, "Y" is returned regardless.
Note: T-SQL I'm fine with, PL/SQL & Oracle is still relatively new to me
WITH AT_TMP_ AS (
SELECT CONTRACT_ID FROM SC_SERVICE_CONTRACT_CFV WHERE
EXISTS(
SELECT 1
FROM SC_SRV_CONTRACT_INVPLN_cfv cs
WHERE SC_SERVICE_CONTRACT_cfv.CONTRACT_ID = cs.contract_id
AND cs.cf$_invoice_date is null
AND CS.CF$_INV_NOT_REQ_DB = 'FALSE'
))
SELECT SC.CONTRACT_ID, CASE
WHEN
SC.CONTRACT_ID IS NOT NULL THEN 'Y'
ELSE 'N'
END AS YES_NO
FROM SC_SERVICE_CONTRACT_cfv SC
LEFT OUTER JOIN
AT_TMP_
ON AT_TMP_.Contract_ID = SC.Contract_ID;
Upvotes: 0
Views: 82
Reputation: 641
You need to do the case in AT_TMP_. SC is never going to be null because it is on the left side of the left join. AT_TMP can be null as it's on the right side of the left join.
WITH AT_TMP_ AS (
SELECT CONTRACT_ID FROM SC_SERVICE_CONTRACT_CFV WHERE
EXISTS(
SELECT 1
FROM SC_SRV_CONTRACT_INVPLN_cfv cs
WHERE SC_SERVICE_CONTRACT_cfv.CONTRACT_ID = cs.contract_id
AND cs.cf$_invoice_date is null
AND CS.CF$_INV_NOT_REQ_DB = 'FALSE'
))
SELECT SC.CONTRACT_ID, CASE
WHEN
AT_TMP_.CONTRACT_ID IS NOT NULL THEN 'Y'
ELSE 'N'
END AS YES_NO
FROM SC_SERVICE_CONTRACT_cfv SC
LEFT OUTER JOIN
AT_TMP_
ON AT_TMP_.Contract_ID = SC.Contract_ID;
Upvotes: 2
Reputation: 13509
I think you need EXISTS instead of LEFT JOIN -
WITH AT_TMP_ AS ( SELECT CONTRACT_ID
FROM SC_SERVICE_CONTRACT_CFV
WHERE EXISTS(SELECT 1
FROM SC_SRV_CONTRACT_INVPLN_cfv cs
WHERE cs.CONTRACT_ID = cs.contract_id
AND cs.cf$_invoice_date is null
AND CS.CF$_INV_NOT_REQ_DB = 'FALSE')
)
SELECT SC.CONTRACT_ID,
CASE WHEN EXISTS (SELECT 1 FROM AT_TMP_
WHERE AT_TMP_.Contract_ID = SC.Contract_ID) THEN 'Y'
ELSE 'N' END AS YES_NO
FROM SC_SERVICE_CONTRACT_cfv SC;
Upvotes: 1
Reputation: 191275
Your case expression isn't referring to at_tmp_
at the moment; you do an outer join but then don't do anything with the result of that join. You can change the case expression to check the value from the CTE instead, as @banana_99 showed.
But you don't really need the CTE. You can use the exists
check directly:
SELECT SC.CONTRACT_ID,
CASE
WHEN EXISTS (
SELECT null
FROM SC_SRV_CONTRACT_INVPLN_cfv SCI
WHERE SCI.CONTRACT_ID = SC.contract_id
AND SCI.cf$_invoice_date is null
AND SCI.CF$_INV_NOT_REQ_DB = 'FALSE'
)
THEN 'Y' ELSE 'N' END AS YES_NO
FROM SC_SERVICE_CONTRACT_cfv SC;
Upvotes: 1