2017-09-18 30 views
0

document_iddirection flag = 'O'で送信し、同じdocument_idを受信して​​同じテーブルに記録するが、新しい行と別の列に記録するプロセスを確認しようとしている:src_document_iddirection = 'I '。SQL - 同じテーブル内の異なる列に同じ値を一致させる

の一致する値を持たない、送信された(Directionフラグ= O)レコードを識別する必要があります。ここでは、direction_flag = 'I'です。 Inbound値に対してOutbound値をチェックするときにEXISTSまたはNot Existsを使用するかどうかはわかりません。以下の表の

EX:それはDirection_flag = I.うまくいけば

select 
    document_id 
from 
    DOCUMENT_TABLE 
where 
    direction_flag = 'O' 
    and 
    client_id = '9999' 
    and 
    EXISTS 
    (
     select 
      document_id 
     from 
      DOCUMENT_TABLE 
     where 
      document_id != src_document_id and direction_flag = 'I' 
    ) 

との対応src_document_idを持っていないとして、クエリがDOCUMENT_ID 34567を返す必要があり、私は十分に明確にされています。 SQLに精通していない

DOCUMENT_ TABLE: 

Document_id  client number Direction flag src_document_id 
12345    9999    O 
23456    9999    O 
34567    9999    O 

aaaaa         I    12345 
aaaab         I    23456 

答えて

0

左の結合を使用して、idフィールドでテーブルを自分自身に参加させることができます。これにより、左側のレコードと右側のレコードだけがすべて表示されます。 where句では、一致しないレコードをフィルタリングすることができます(src_document_idはnullです)。

SELECT 
d1.document_id 
FROM DOCUMENT_TABLE d1 
LEFT JOIN DOCUMENT_TABLE d2 ON d1.document_id = d2.src_document_id 
WHERE 
d1.direction_flag = 'O' AND 
d2.src_document_id IS NULL AND 
d2.direction_flag = 'I' 
0

相関サブクエリのパフォーマンスは一般的に低くなります。私はあなたのクエリが自己結合サブクエリでより良いと思う。

(相関サブクエリがSELECT句又はWHERE文節のいずれかに存在し、天然に非効率的であるセット内の行ごとに評価されるサブクエリをしている一般圏(思う:O(n*m)複雑さ)と必ずしももたらしません最適化された実行計画)

私はこれだろう:私は、それは「ソース文書にdocument_table」との意思および分化を作るように私サブクエリのための完全なクエリを使用し、「てる

SELECT 
    [source].document_id 
FROM 
    (
     SELECT 
      document_id 
     FROM 
      document_table 
     WHERE 
      direction_flag = 'O' 
    ) AS [source] 
    LEFT JOIN 
    (
     SELECT 
      document_id, 
      src_document_id 
     FROM 
      document_table 
     WHERE 
      direction_flag = 'I' 
    ) AS [dest] 
     ON [source].document_id = [dest].src_document_id 
WHERE 
    dest.document_id IS NULL 

注意を210先のドキュメントのために "@Donal gave in his answerのようなよりコンパクトなクエリと比較してより明確に - 両方のクエリが正しいので、それはスタイルと可読性に純粋に落ちています。

0

Dai's answerは正しい

ですが、小さなミスをDonal's answerています。正解の場合、それは次のようにする必要があります:「d2.src_document_id」は常にnullであるため、

SELECT 
d1.document_id 
FROM DOCUMENT_TABLE d1 
LEFT JOIN DOCUMENT_TABLE d2 ON d1.document_id = d2.src_document_id 
AND d2.direction_flag = 'I' 
WHERE 
d1.direction_flag = 'O' AND 
d2.src_document_id IS NULL 

その文「d2.direction_flag = 『I』」はどこ状態に無用です。

関連する問題