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'
これを試してください-
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'
パーツを変更する
TradeId NOT EXISTS
に
TradeId NOT IN
EXISTS(Transact-SQL) と IN(Transact-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
NOT IN を使用できます。必要に応じて試してください。