web-dev-qa-db-ja.com

SQL NOTEXISTSステートメントでCASEを使用する方法

SQLには非常に複雑なクエリがあり、さまざまなテーブルから大量の情報を取得して、さまざまな結合を実行しています。特定のtradeIdが2つの異なるテーブルに含まれているかどうかをチェックする列をプルしたいと思います。しかし、これを適切に行う方法に行き詰まっています。

以下のコードは、TCM(2つのテーブルの単なる組み合わせ)にないTradeテーブルのすべてのTradeIdを提供します。ただし、Tradeテーブルのすべての取引と、それがTCMで見つかったかどうかを示す列が必要です。

これはCASEWHENクエリで実行されることはわかっていますが、CASEWHENに収まるように構造化する方法がわかりません。

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'

これをCASEWHENステートメントに収めようとしましたが、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'
7
user2599240

これを試してください-

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'
9
Devart

パーツを変更する

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
4
Adriaan Stander

NOT IN を使用できます。必要に応じて試してください。

0
Novice