2014-12-06 2 views
0

У меня есть этот запрос, но я получаю две колонки houseid:Удалить дубликаты столбец после SQL запроса

Как получить только один?

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? Таким образом, запрос просто вернет значение?

+1

Два 'houseid' из разных таблиц, и вы получите и потому, что вы выбираете оба. – marekful

+0

Хорошо, я просто это понял. Спасибо. Как взять среднее значение «epatmpg»? Таким образом, запрос просто вернет значение? – nodebase

+0

просто удалите один houseid из вашего списка выбора. – HaveNoDisplayName

ответ

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() основан на производной таблице.

+0

Хорошо, я просто это понял. Спасибо. Как взять среднее значение «epatmpg»? Таким образом, запрос просто вернет значение? – nodebase

+0

Вы имеете в виду * one * avg за весь (объединенный) стол? –

+0

Да. Но я думаю, что я просто понял это. Как вы это сделаете? – nodebase

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 
+0

Я должен отметить, что это средний размер домохозяйства. Если вы хотите усреднить по всем домам, просто удалите группу и домохозяйку из выбранного. В любом случае, в зависимости от того, какие данные находятся в таблицах, это может не закончиться с точным результатом, который вы хотите, если есть «дубликаты». Возможно, вам придется сделать подзапрос, если это так. – EGP

Смежные вопросы