SQL的新手,所以我很欣赏任何关于我在这个SQL语句中出错的提示。
我有两个表,一个名为Hotel
,另一个名为Review
。它们由HotelID
链接。我正在尝试返回与HotelID
大于或等于3(OverallRating
表中的属性)相关联的Hotel
和平均Cleanliness
(a Review
属性)大于或等于5.
我知道有一个事实是没有 HotelID
满足这两个要求,但这个陈述会返回很多结果。
SELECT
Hotel.HotelID
FROM
Hotel
INNER JOIN Review ON Hotel.HotelID = Review.ReviewID
GROUP BY
Hotel.HotelID
HAVING
( Hotel.OverallRating >= 3 )
AND
( AVG( NULLIF( Review.Cleanliness, -1 ) ) >= 5);
NULLIF
用于排除-1的值(表示没有评级)。
全部谢谢
答案 0 :(得分:2)
我认为问题是你INNER JOIN
声明。当您将两个表连接在一起时,您希望将它们连接到它们之间相关的数据上。您目前正在加入Hotel.HotelID = Review.ReviewID
。我的猜测是这些都是各自表格的主键,而且ReviewID没有指向酒店的记录。
尝试将您的加入更改为ON Hotel.HotelID = Review.HotelID
。
答案 1 :(得分:2)
你的内心联系是错误的。
INNER JOIN Review ON Hotel.HotelID = Review.ReviewID
应该是
INNER JOIN Review ON Hotel.HotelID = Review.HotelID
在联接中使用HotelId而非ReviewId
答案 2 :(得分:1)
SELECT h.HotelID
FROM Hotel h JOIN
(SELECT r.HotelId, AVG(r.Cleanliness) as avg_cleanliness
FROM Review r
GROUP BY r.HotelId
) r
ON h.HotelId = r.HotelId
WHERE h.OverallRating >= 3 AND r.avg_cleanliness >= 5;
答案 3 :(得分:-2)
我也是sql的新手,但你尝试过使用WHERE语句吗?
选择Hotel.HotelID 从酒店 INNER JOIN评论Hotel.HotelID = Review.HotelID WHERE(Hotel.OverallRating> = 3)AND(AVG(NULLIF(Review.Cleanliness,-1))> = 5);