8

我在 SQL 中有一个相当复杂的查询,我从各种表中提取大量信息并进行各种连接。我想拉一列来检查特定的 tradeId 是否包含在 2 个不同的表中。我被困在如何正确地做到这一点。

下面的代码为我提供了 Trade 表中不在 TCM 中的所有 TradeId(这只是 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'

这是我尝试将其放入 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'
4

3 回答 3

10

试试这个——

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'
于 2013-07-19T12:21:05.247 回答
4

更换零件

TradeId NOT EXISTS

TradeId NOT IN

看看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
于 2013-07-19T12:15:52.140 回答
0

您可以使用 NOT IN。根据您的需要尝试。

于 2013-07-19T12:19:50.637 回答