2016-07-28 36 views
1

我在嘗試弄清楚如何編寫將返回左表中找到的相同數量記錄的sql語句時遇到了一些問題。加入後,將返回左表中找到的相同數量的記錄

例如,我們有兩個表,交易和合作夥伴。由於表格最初是如何設計的,因此不存在檢索完全匹配對的方法。 IE瀏覽器。交易可能有許多與之相關的合作伙伴。

我想要做的是顯示所有與合作伙伴ID的交易。如果一項交易有多個匹配的合作伙伴ID,那麼我需要首先進行比賽並丟掉其餘的比賽。如果交易沒有匹配的合作伙伴ID,我仍然需要顯示它,但合作伙伴ID的值爲空或空值。

事務表

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

您可以使用outer joinrow_number

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 

這將選擇從transaction表中的所有記錄,然後僅1從partner表,如果它的存在。

0

我不知道你怎麼知道你不想P4T2合作以及P3,但我發現這個工作對我來說,假設它的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個合作伙伴設置了不同的交易,但他們每個都有相同的名稱。我需要展示的是該合作伙伴的名稱,因此,一個交易與多個合作伙伴匹配並不重要,因爲我要追蹤的這一列在這些合作伙伴之間是相同的。 – Soul3lade

相關問題