2016-07-28 9 views
1

左側のテーブルにあるレコードと同じ量のSQL文を返す方法を理解するのに問題があります。左テーブルにあるレコードと同じ量のレコードが返されます。

例えば、取引とパートナーという2つのテーブルがあります。テーブルが元々どのように設計されていたかにより、正確に一致するペアを検索する方法は存在しません。 IE。トランザクションに関連する多くのパートナーが存在する可能性があります。

私が探しているのは、パートナーIDを持つすべての取引を表示することです。取引に複数の一致する取引先IDがある場合は、最初に一致したものを取り出して残りの部分を破棄する必要があります。取引に一致する取引先IDがない場合でも、それを表示する必要がありますが、パートナーIDの値が空またはnullです。

トランザクション表

Transaction ID | ID 1 | ID 2 
-------------- +---------+---------- 
T1    | A  | 1 
T2    | C  | 3 
T3    | B  | 1 
T4    | D  | 4 
T5    | A  | 2 

パートナー表

Transaction ID | ID 1 | ID 2 
---------------+---------+---------- 
P1    | A  | 1 
P2    | B  | 2 
P3    | C  | 3 
P4    | C  | 3 
P5    | D  | 4 

望ましい結果

Transaction ID| ID 1 | ID 2  | Partner ID 
--------------+---------+----------+----------- 
T1   | A  | 1  | P1 
T2   | C  | 3  | P3 
T3   | B  | 1  | Null 
T4   | D  | 4  | P5 
T5   | A  | 2  | Null 

私は外のいくつかのフォームを必要とするように私が感じるには、必ず何の取引が照会しないされていない作るために参加します重複するトランザクションが表示されないようにする方法を解読することはできません。

おかげ

答えて

1

SQLテーブルには、「最初の」レコードという概念はなく、順序を指定する列はありません。しかし、あなたが何をしたいの基本的な考え方は、left joinrow_number()を使用しています:

select t.*, p.partnerid 
from transaction t left join 
    (select p.*, 
      row_number() over (partition by id1, id2 order by partnerid) as seqnum 
     from partner p 
    ) p 
    on t.id1 = p.id1 and t.id2 = p.id2 and p.seqnum = 1; 

このバージョンでは、「パートナーIDの最小値」を意味する「最初の」取ります。

+0

おかげで働いていた多くのことを完全に。 – Soul3lade

0

あなたはrow_numberouter joinを使用することができます。

select * 
from (
    select t1.transactionid, t1.id1, t1.id2, t2.transactionid as partnerid, 
      row_number() over (partition by t1.transactionid order by t2.transactionid) rn 
    from Transaction t1 
     left join Partner t2 on t1.id1 = t2.id1 and t1.id2 = t2.id2 
) t 
where rn = 1 

これはのみ1 partnerテーブルから、それが存在するならば、transactionテーブルからすべてのレコードを選択します。

0

は、私はあなたがP4P3と同様T2と提携したくない知っているかどうかはわかりませんが、私はそれがlowest IDだと仮定すると、これは私のために働いた:

select t1.transactionid, t1.id1, t1.id2, min(t2.transactionid) as partnerid 
from Transaction t1, Partner t2 where t1.id1 = t2.id1(+) and t1.id2 = t2.id2(+) 
group by t1.transactionid, t1.id1, t1.id2 
order by t1.transactionid, t1.id1, t1.id2 
+0

質問のためにテーブルを大幅に簡略化しましたが、基本的に各パートナーはパートナー名を持ちます。この表では、3つのパートナーが異なるトランザクションで設定されている可能性がありますが、それぞれが同じ名前を持つことになります。私が表示する必要があるのはそのパートナーの名前なので、後に進む列はそれらのパートナー間で同じなので、1つのトランザクションが複数のパートナーに一致することは問題ではありません。 – Soul3lade

関連する問題