さまざまなテーブルから大量の情報を取得し、さまざまな結合を行っている SQL で非常に複雑なクエリを実行しています。特定の tradeId が 2 つの異なるテーブルに含まれているかどうかを確認する列を取得したいと考えています。私はこれを適切に行う方法に行き詰まっています。
以下のコードは、TCM にない Trade テーブルのすべての TradeIds を提供します (これは 2 つのテーブルの組み合わせです)。ただし、Trade テーブルのすべての取引と、それが 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'