PostgreSQL:如何进行左联接并仅匹配每个左值一次



这种类型的问题一直困扰着我。

我有2个具有货币值的表,我必须从另一个表中找到匹配值。如果第一个表的值(例如10)三次,而第二个表具有2次,则我想要的结果需要显示2个匹配的值,而一个值是无与伦比的。这是一个多对多的问题。

我在Google doc https://docs.google.com/document/d/198zisghr6wc2fwnc5bcr5bcr5bcr5dtdjx3jcycfq9q9qlj-eqlj-eqseo/Edit?usp=sharing

sharing sharing sharing

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

我更喜欢Postgres,但是通用的SQL解决方案可以。有人可以帮助吗?

使用窗口函数 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

最新更新