SQL:如何进行左连接并仅匹配每个左值

时间:2017-12-20 07:18:52

标签: sql postgresql

这类问题令我感到困惑。

我有2个带有货币值的表,我必须从另一个表中找到匹配的值。如果第一个表有一个值(例如10)三次而第二个表有2次,那么我想要的结果需要显示匹配的2个值,并且一个是不匹配的。这是一个多对多的问题。

我已在Google文档https://docs.google.com/document/d/198ZiSGhR6wC2FWNc5Bcr5DTDjx3jCycFq9qlj-eQsEo/edit?usp=sharing

中概述了该问题

并在SQL Fiddle中实现它,包括各种失败的尝试。 http://sqlfiddle.com/#!17/80353/1

我更喜欢Postgres,但一般的SQL解决方案没问题。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

使用窗口函数row_number和完整联接

select a.id_a, coalesce(a.value, b.value), b.id_b
from
(
    select *, row_number() over (partition by value order by id_b) rn
    from b
) b
full join
(
    select *, row_number() over (partition by value order by id_a) rn
    from a
) a on b.value = a.value and
       b.rn = a.rn

sqlfiddle demo