SQL是否正确查询

时间:2017-06-25 17:59:06

标签: sql

table relationships

鉴于这些关系,您如何查询以下内容: 预订至少退休金的游客(姓名和电子邮件)评分大于9 ,但没有预订任何三星级酒店 评级小于9

以下是否正确?

SELECT Tourists.name, Tourists.email
FROM Tourists
WHERE EXISTS (
    SELECT id FROM Bookings
    INNER JOIN Tourists ON Bookings.touristId=Tourists.id 
    INNER JOIN AccomodationEstablishments ON Bookings.accEstId=AccomodationEstablishments.id
    INNER JOIN AccomodationTypes ON AccomodationEstablishments.accType=AccomodationTypes.id 
    WHERE   AccomodationTypes.name = 'Pension' AND 
        AccomodationEstablishments.rating > 9
) AND NOT EXISTS (
    SELECT id FROM Bookings
    INNER JOIN Tourists ON Bookings.touristId=Tourists.id 
    INNER JOIN AccomodationEstablishments ON Bookings.accEstId=AccomodationEstablishments.id
    INNER JOIN AccomodationTypes ON AccomodationEstablishments.accType=AccomodationTypes.id 
    WHERE   AccomodationTypes.name = 'Hotel' AND 
        AccomodationEstablishments.noOfStars = 3 AND 
        AccomodationEstablishments.rating < 9
)

1 个答案:

答案 0 :(得分:1)

我会使用聚合和having

来做到这一点
SELECT t.name, t.email
FROM Bookings b INNER JOIN
     Tourists t
     ON b.touristId = t.id INNER JOIN
     AccomodationEstablishments ae
     ON b.accEstId = ae.id INNER JOIN
     AccomodationTypes a
     ON ae.accType = a.id 
GROUP BY t.name, t.email
HAVING SUM(CASE WHEN a.name = 'Pension' AND ae.rating > 9 THEN 1 ELSE 0 END) > 0 AND
       SUM(a.name = 'Hotel' AND ae.noOfStars = 3 AND ae.rating < 9 THEN 1 ELSE 0 END)= 0;

您的方法也有效,但在子查询中可能需要t.id