SQL如何将CASE与NOT EXISTS语句一起使用

use*_*240 7 sql-server exists

我在SQL中有一个非常复杂的查询,我从各种表中提取大量信息并进行各种连接.我想拉一个列来检查特定的tradeId是否包含在2个不同的表中.虽然如此,我仍然坚持如何做到这一点.

下面的代码为我提供了Trade表中所有不在TCM中的TradeIds(它只是2个表的组合).但是,我希望交易表中的所有交易,然后是一列,以表明它是否在TCM中找到.

我知道这将通过CASE WHEN查询完成,但我很困惑如何构造它以便它适合CASE WHEN.

With subCA As
(Select distinct OTPTradeId, ConfoAuditSenderRef from ConfirmationAudit where ConfoAuditSenderRef like 'HBEUM%'),
TCM As
(Select distinct OTPTradeID from subCA union ALL select TradeId from subCA inner join ConfirmationSent on (OTPTradeId = ConfoId 
AND ConfoAuditSenderRef like 'HBEUMN%'))
select TradeId from Trade where NOT EXISTS (Select OtpTradeId from TCM where OtpTradeId = TradeId) 
and TradeDate = '17 jun 2013'
Run Code Online (Sandbox Code Playgroud)

下面是我试图将它放入CASE WHEN语句但我得到一个错误,因为如果没有我认为的WHERE,则不允许使用NOT EXISTS.但我所追求的是这样的.如果我使用NOT IN它变得非常慢,就像5分钟一样,这是一个更大的查询的一部分,我不希望它花这么长时间 - 如果可能的话!

With subCA As
(Select distinct OTPTradeId, ConfoAuditSenderRef from ConfirmationAudit where ConfoAuditSenderRef like 'HBEUM%'),
TCM As
(Select distinct OTPTradeID from subCA union ALL select TradeId from subCA inner join ConfirmationSent on (OTPTradeId = ConfoId 
AND ConfoAuditSenderRef like 'HBEUMN%'))
select TradeId,
CASE WHEN
    (TradeId NOT EXISTS (Select OtpTradeId from TCM where OtpTradeId = TradeId) Then 'Y' Else 'N' End As 'TCM' 
from Trade
WHERE TradeDate = '17 jun 2013'
Run Code Online (Sandbox Code Playgroud)

Dev*_*art 9

试试这个 -

SELECT
       t.TradeId
     , CASE WHEN NOT EXISTS (
          SELECT 1
          FROM TCM t2
          WHERE t2.OtpTradeId = t.TradeId
      ) Then 'Y' Else 'N' END As 'TCM' 
FROM Trade t
WHERE t.TradeDate = '17 jun 2013'
Run Code Online (Sandbox Code Playgroud)


Adr*_*der 4

改变部分

TradeId NOT EXISTS
Run Code Online (Sandbox Code Playgroud)

TradeId NOT IN
Run Code Online (Sandbox Code Playgroud)

看一下EXISTS (Transact-SQL)IN (Transact-SQL)之间的区别

看看这个小例子

SQL 小提琴演示

除此之外,也许可以重新审视一下CASE 语法 (Transact-SQL)

Simple CASE expression: 
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 
Searched CASE expression:
CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END
Run Code Online (Sandbox Code Playgroud)