加入将返回左表中找到的相同数量的记录

时间:2016-07-28 13:36:29

标签: sql oracle

我在尝试弄清楚如何编写一个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

我觉得我需要某种形式的外部联接以确保不会查询任何事务,但我无法破译如何确保不会显示重复的事务。

由于

3 个答案:

答案 0 :(得分: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;

此版本将“first”表示为“合作伙伴ID的最低值”。

答案 1 :(得分:0)

您可以outer join使用row_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表中的所有记录,如果存在,则从partner表中仅选择1个。

答案 2 :(得分:0)

我不确定你是怎么知道你不希望P4T2以及P3合作,但我发现这对我有用,假设它是{{ 1}}:

lowest ID