使用两个表上的关系获取最大值

Posted

技术标签:

【中文标题】使用两个表上的关系获取最大值【英文标题】:Getting max value using relation on two table 【发布时间】:2020-09-22 20:29:32 【问题描述】:

使用 postgresql 我必须建立两个名为 country 和 neighbour 的表。这是我写的查询。

CREATE TABLE country (
    cid         INTEGER     PRIMARY KEY,
    cname       VARCHAR(20) NOT NULL,
    height      INTEGER     NOT NULL,
    population  INTEGER     NOT NULL
);

CREATE TABLE neighbour (
    country     INTEGER     REFERENCES country(cid) ON DELETE RESTRICT,
    neighbor    INTEGER     REFERENCES country(cid) ON DELETE RESTRICT, 
    length      INTEGER     NOT NULL,
    PRIMARY KEY(country, neighbor)
);

现在我想解决的问题是,对于每个国家,我必须找到一个海拔最高的邻国。我必须报告它的id和名字

我必须得到国家的 id 和 name,它是邻国的 id 和 name,海拔最高。

SELECT country.cid,country.cname,foo.cid,foo.cname
from country,(SELECT cid,cname
from country
    join neighbour
        on country.cid = neighbour.neighbor) as foo
group by country.cid, country.cname, foo.cid, foo.cname;

这是我所做的,但我没有在哪里添加 max() 子句来查找最高海拔点。

【问题讨论】:

【参考方案1】:

您可以在以下位置使用连接和区分:

select distinct on (c1.cid, c1.cname)
    c1.cid, 
    c1.cname, 
    c2.cid neighbour_cid, 
    c2.cname, neighbour_name
from country c1
inner join neighbour n on n.cid = c1.cid
inner join country c2 on c2.cid = n.neighbour
order by c1.cid, c1.cname, c2.height desc

对于每个国家,查询通过桥接表neighbour 表进行关系,并通过第二次加入country 恢复所有邻居。然后,distinct on 只保留height 最大的邻居。

【讨论】:

以上是关于使用两个表上的关系获取最大值的主要内容,如果未能解决你的问题,请参考以下文章

同一张表上的多个关系

使用 nspredicate 获取具有最大属性值的实体以及一个关系

多对多关系连接表上的sails.js 额外字段

MySQL join 与关系表上的匹配

如何使用 Exists 语句以及主表上的条件获取匹配记录

聚合函数以提取更多记录字段数据