我在尝试弄清楚如何编写一个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
我觉得我需要某种形式的外部联接以确保不会查询任何事务,但我无法破译如何确保不会显示重复的事务。
由于
答案 0 :(得分:1)
SQL表没有“第一”记录的概念,没有一些列来指定排序。但是,您想要的基本概念使用left join
和row_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)
我不确定你是怎么知道你不希望P4
与T2
以及P3
合作,但我发现这对我有用,假设它是{{ 1}}:
lowest ID