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查询后删除重复列的主要内容,如果未能解决你的问题,请参考以下文章