SELECT 的情况 - 不返回预期结果
Posted
技术标签:
【中文标题】SELECT 的情况 - 不返回预期结果【英文标题】:Case with SELECT - not returning expected results 【发布时间】:2021-06-07 14:11:12 【问题描述】:如果 SC 中的 ContractID 出现在 AT_TMP_ 中,我将尝试返回“Y”,否则返回“N”。
这是我当前的代码 - 目前,无论如何都会返回“Y”。
注意:T-SQL 我没问题,PL/SQL 和 Oracle 对我来说还是比较新的
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;
【问题讨论】:
【参考方案1】:您需要在 AT_TMP_ 中执行此案例。 SC 永远不会为空,因为它位于左连接的左侧。 AT_TMP 可以为空,因为它位于左连接的右侧。
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;
【讨论】:
这不是和OP的答案一样的答案吗? @AnkitBajpai - 不;这已将 case 表达式更改为查看AT_TMP_.CONTRACT_ID
而不是 SC.CONTRACT_ID
。如果强调或解释得更多,那就太好了。
刚刚意识到同样的事情。
感谢您的回答 - 谢谢!最终我选择了 Alex 的方法,但感谢您的支持。【参考方案2】:
您的 case 表达式目前不是指at_tmp_
;您进行了外部联接,但对该联接的结果不做任何事情。您可以更改 case 表达式以检查 CTE 中的值,如 @banana_99 所示。
但您并不真正需要 CTE。可以直接使用exists
检查:
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;
【讨论】:
谢谢,亚历克斯。您提出了一个很好的观点,即实际上不需要 CTE,这是我最终用来获得所需内容的方法。【参考方案3】:我认为你需要 EXISTS 而不是 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;
【讨论】:
以上是关于SELECT 的情况 - 不返回预期结果的主要内容,如果未能解决你的问题,请参考以下文章