SQL查询后删除重复列

时间:2014-12-06 00:12:12

标签: sql postgresql join aggregate-functions

我有这个问题,但我得到两列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的平均值?所以查询只会返回值?

2 个答案:

答案 0 :(得分:5)

最优雅的方法是在显式连接条件中使用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()基于派生表。

答案 1 :(得分:0)

不是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