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