Sql 将返回左表中相同数量记录的联接

Sql 将返回左表中相同数量记录的联接,sql,oracle,Sql,Oracle,我在试图弄清楚如何编写一条sql语句时遇到了一些问题,该语句将返回左表中找到的相同数量的记录 例如,我们有两个表,事务和合作伙伴。由于表最初是如何设计的,因此不存在检索精确匹配对的方法。也就是说,一项交易可能有许多与其相关的合作伙伴 我要做的是显示所有具有合作伙伴ID的交易。如果一个交易有多个匹配的合作伙伴ID,那么我需要获取第一个匹配项,并丢弃其余的。如果事务没有匹配的合作伙伴ID,我仍然需要显示它,但合作伙伴ID的值为空或null 事务表 Transaction ID | ID 1 |

我在试图弄清楚如何编写一条sql语句时遇到了一些问题,该语句将返回左表中找到的相同数量的记录

例如,我们有两个表,事务和合作伙伴。由于表最初是如何设计的,因此不存在检索精确匹配对的方法。也就是说,一项交易可能有许多与其相关的合作伙伴

我要做的是显示所有具有合作伙伴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
我觉得我需要某种形式的外部联接,以确保不查询任何事务,但我无法解释如何确保不显示重复的事务


谢谢

您可以将
外部联接
行号
一起使用:

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
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;

这将从
事务
表中选择所有记录,然后从
合作伙伴
表中仅选择1条记录(如果存在)。

SQL表没有“第一条”记录的概念,没有指定顺序的列。但是,您想要什么的基本思想是使用
左连接
行数()


这个版本将“first”理解为“合作伙伴id的最低值”。

我不确定您如何知道您不希望
P4
T2
以及
P3
合作,但我发现这对我来说很有效,假设它是
最低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

对于这个问题,我大大简化了表格,但基本上每个合作伙伴都有一个合作伙伴名称。在该表中,可能有3个合作伙伴设置了不同的事务,但它们都具有相同的名称。我只需要显示合作伙伴的名称,所以一个事务是否匹配多个合作伙伴并不重要,因为我要查找的列在这些合作伙伴之间是相同的。