2017-06-25 47 views
0

table relationshipsSQLクエリが正しいかどうか

、次のクエリを実行できる方法:定格を超える9ある少なくとも年金を予約 観光客(名前と電子メール)が、 以下の3つ星ホテルを予約していない。

以下は正しいですか?

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

エラーが発生しますか? SQLFiddleを使用してクエリをテストします。 –

+0

それはあなたが望むものを返しますか? –

+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を必要としています。

+0

答えてくれてありがとう@GordonLinoff!私はこの短いバージョンが好きです。私はキーワードを使用しなかった:CASE、WHEN、THEN、ELSE、END。 多分http://www.1keydata.com/sql/sql-case.htmlは、https://www.w3schools.com/sql/にこれらの情報が含まれていないため、より多くの情報を得ることができます。 – esbej

関連する問題