SQL查询后删除重复列

Posted

技术标签:

【中文标题】SQL查询后删除重复列【英文标题】:Remove duplicate column after SQL query 【发布时间】:2014-12-06 00:12:11 【问题描述】:

我有这个查询,但我得到两列 houseid:

我如何只得到一个?

SELECT vehv2pub.houseid, vehv2pub.vehid, vehv2pub.epatmpg, 
       dayv2pub.houseid, dayv2pub.trpmiles
FROM vehv2pub, dayv2pub
WHERE vehv2pub.vehid >= 1
      AND dayv2pub.trpmiles < 15
      AND dayv2pub.houseid = vehv2pub.houseid;

另外,我如何获得epatmpg 的平均值?所以查询只会返回值?

【问题讨论】:

这两个 houseid 来自不同的表,你得到了两个,因为你选择了两个。 好的,我刚刚意识到这一点。谢谢你。我如何取 'epatmpg' 的平均值?所以查询只会返回值? 只需从您的选择列表中删除一个 houseid。 【参考方案1】:

最优雅的方法是在显式连接条件中使用USING 子句:

SELECT houseid, v.vehid, v.epatmpg, d.houseid, d.trpmiles
FROM   vehv2pub v
JOIN   dayv2pub d USING (houseid)
WHERE  v.vehid >= 1
AND    d.trpmiles < 15;

这样,houseid 列仅在结果中一次,即使您使用SELECT *

Per documentation:

USING 是一个简写符号:它采用逗号分隔的列表 连接表必须共有的列名,并形成一个 连接条件指定每对列的相等性。 此外,JOIN USING 的输出对于每个 相等的输入列对,然后是每个表中的剩余列。

要获得所选行的平均 epatmpg

SELECT avg(v.epatmpg) AS avg_epatmpg
FROM   vehv2pub v
JOIN   dayv2pub d USING (houseid)
WHERE  v.vehid >= 1
AND    d.trpmiles < 15;

如果dayv2pub 中有多个匹配项,则派生表可以在连接后保存vehv2pub 中每一行的多个实例。 avg() 基于派生表。

【讨论】:

好的,我刚刚意识到这一点。谢谢你。我如何取 'epatmpg' 的平均值?所以查询只会返回值? 你的意思是 一个 平均整个(加入)表? 是的。但我想我只是想通了。你会怎么做? 欧文的回答非常好。只是一个警告 - 如果查询中有“重复”行,上述内容可能无法为您提供您想要的平均值,这完全取决于数据的具体情况。我们必须知道 vehv2pub 表和 dayv2pub 表中有什么才能确定。 @EGP:没错。我按照要求提供了整个派生表的平均值。我添加了一些解释。【参考方案2】:

不是 100% 确定这在 postgres sql 中有效,但类似这样的东西在 SQL 服务器中获得平均值:

SELECT vehv2pub.houseid, avg(vehv2pub.epatmpg)
FROM vehv2pub, dayv2pub
WHERE vehv2pub.vehid >= 1
AND   dayv2pub.trpmiles < 15
AND   dayv2pub.houseid = vehv2pub.houseid
GROUP BY vehv2pub.houseid

【讨论】:

我应该注意,这是每个 houseid 的平均值。如果您想要所有房屋的平均值,只需从选择中删除 group by 和 houseid。在任何一种情况下,根据表中的数据,如果存在“重复”,它可能不会得到您想要的确切结果。如果是这种情况,您可能必须执行子查询。

以上是关于SQL查询后删除重复列的主要内容,如果未能解决你的问题,请参考以下文章

如何更改我的 sql 查询,以便删除列中具有某些值的行 [重复]

sql 查询 一个表中某几列数据

连接多个表后如何从sql查询结果中删除重复记录

sql语句去重

sql,表与表之间列的包含查询

sql 查询数据表后 在统计某一列数据不重复的数量