8

さまざまなテーブルから大量の情報を取得し、さまざまな結合を行っている 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'
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 に答える