让我们说我有以下查询来列出人们拥有的房屋的平均价值:
SELECT PERSON.NAME, AVG
FROM PERSON, (
SELECT HOUSE.PID AS PID, AVG(HOUSE.VALUE) as AVG
FROM HOUSE
GROUP BY PID
) HOUSES
WHERE PERSON.PID = HOUSES.PID OR PERSON.ID NOT IN (
SELECT PID
FROM HOUSE
)
查询执行了我想要它做的事情,除了它没有包含没有房子的人,谁应该有" 0"作为他们的房屋成本平均值。
这可能,或者我离开了吗?
答案 0 :(得分:2)
简单规则:从不在FROM
子句中使用逗号。 始终使用显式JOIN
语法。例如,在这种情况下,您需要LEFT JOIN
,但无法表达它。
SELECT p.NAME, AVG_VALUE
FROM PERSON p LEFT JOIN
(SELECT PID , AVG(VALUE) as AVG_VALUE
FROM HOUSE
GROUP BY PID
) h
ON p.PID = h.PID;
如果您想要0
而不是NULL
,请在外部查询中使用COALESCE(AVG_VALUE, 0) as AVG_VALUE
。
答案 1 :(得分:0)
您应该使用left join
,这样就会出现在人员表中的记录,并且在房屋表中没有相应的记录,这些记录会在房屋的列上显示空格