【问题标题】:SQL How to use CASE with a NOT EXISTS statementSQL 如何将 CASE 与 NOT EXISTS 语句一起使用
【发布时间】:2013-07-18 17:15:58
【问题描述】:

我在 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'

【问题讨论】:

    标签: sql-server exists


    【解决方案1】:

    更换零件

    TradeId NOT EXISTS
    

    TradeId NOT IN
    

    看看EXISTS (Transact-SQL)IN (Transact-SQL)的区别

    看看这个小例子

    SQL Fiddle DEMO

    除此之外,也许重新审视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
    

    【讨论】:

      【解决方案2】:

      试试这个 -

      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'
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-19
          • 2013-10-30
          • 1970-01-01
          • 1970-01-01
          • 2013-04-17
          相关资源
          最近更新 更多