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