2012-03-10 4 views
0

私は「Daniel Johnston」によってレビューされたすべてのレストランをリストアップするか、イタリア語と少なくとも1つの評価スコアの両方を少なくとも4つ以上持たなければならないという質問があります。EXISTSをSQLでORで使用できますか?

このクエリをしよう:

SELECT name 
FROM RESTAURANT 
WHERE EXISTS 
    (SELECT rest_id 
    FROM RESTAURANT, RATES 
    WHERE RESTAURANT.rest_id=RATES.rest_id AND RESTAURANT.type = 'Italian' AND RATES.score>=4) 
OR rest_id IN 
    (SELECT rest_id 
    FROM REVIEWS, USER 
    WHERE USER.user_id=REVIEWS.user_id AND USER.fname = 'Daniel' AND USER.sname = 'Johnston'); 

が、それはエラーを返し続けます。私は別々の部品を別々に走らせています。彼らは大丈夫です。だから私はEXISTSとORを使うことができないのだろうかと思っています。できなければもっと良い方法は何でしょうか?

イタリア語で、少なくとも1つのレビュースコアが4以上あるので、レストランの名前を欲しいと思うので、EXISTSはそれに適していて、2つのEXISTSを使用しても違いはありませんなぜ私は2番目の部分の通常のネストされたクエリに戻ります。私はたくさんのことをぶち壊してしまったし、どこが間違っているのかわからないので、どんな助けでも大歓迎です!

+3

エラーが発生していることを確認すると役立ちます。また、どのRDBMSを使用していますか? –

+0

なぜrest_id IN(...)を2回だけ使用できないのですか? –

答えて

0
SELECT name 
FROM RESTAURANT 
WHERE rest_id IN (SELECT rest_id 
        FROM RESTAURANT, RATES 
        WHERE RESTAURANT.rest_id=RATES.rest_id 
        AND RESTAURANT.type = 'Italian' 
        AND RATES.score>=4) 
OR rest_id IN (SELECT rest_id 
       FROM REVIEWS, USER 
       WHERE USER.user_id=REVIEWS.user_id 
       AND USER.fname = 'Daniel' 
       AND USER.sname = 'Johnston'); 
0

私は、既存のクエリを間違って一つのことを見ることができ、そしてそれは、このサブクエリでいることである:

SELECT rest_id 
    FROM RESTAURANT, RATES 
    WHERE RESTAURANT.rest_id=RATES.rest_id AND RESTAURANT.type = 'Italian' AND RATES.score>=4 

...あなたはは、あなたが取得したいrest_id を指定する必要がありますあなたはRDBを使用している場合を除き、すなわち

SELECT RESTAURANT.rest_id 
    FROM RESTAURANT, RATES 
    WHERE RESTAURANT.rest_id=RATES.rest_id AND RESTAURANT.type = 'Italian' AND RATES.score>=4 

は、あなたが個別にそのクエリを実行してきましたし、それが働いていたなら、あなたが言うように、私はかなり理由を把握することはできません、と述べましたMS私は慣れていない。通常、ORを使ってINISとEXISTSを混在させることはできません。確かに、私の編集では、クエリはMySQLやTrasact-SQLのような共通言語の実装で動作するはずです。

+0

私はopenoffice Baseを使用していましたが、その後私はAccessを使用していました。回答ありがとう:) – user1261648

+0

ああ、はい。 OpenOffice Baseは、私の経験から覚えていることから、公正な数少ない場所では奇妙な奇妙なものです。しかし、私の経験はかなり古くなっています... –

1

サブクエリはめったに最高のパフォーマンスを提供しません。それはまた、より少ない競合する名前(あなたの例では、内部クエリのいずれかで非自明な方法でrest_idコンフリクト)

SELECT name 
FROM RESTAURANT 
LEFT JOIN RATES 
    ON RESTAURANT.rest_id = RATES.rest_id 
LEFT JOIN REVIEWS 
    ON RESTAURANT.rest_id = REVIEWS.rest_id 
LEFT JOIN [USER] 
    ON REVIEWS.user_id = [USER].user_id 
WHERE RESTAURANT.type = 'Italian' AND RATES.score>=4 
    OR [USER].fname = 'Daniel' AND [USER].sname = 'Johnston'; 

簡単なデモhereとの名前が容易になります。

あなたの疑問に答えるためには、はい、ORでEXISTSを使用することができます。メインクエリとサブクエリの間で名前を真っ直ぐにしておかなければなりません。

+0

古典的なエラー:結果にはさらに多くの行があり、結果には重複する行が含まれていることが示され、リレーショナルデータはなくなりました。 'DISTINCT'キーワードを追加するとすべてのパフォーマンス上のメリットがウィンドウに表示されます(すべてのSQL製品に関する同様の徹底的な記述で): – onedaywhen

+0

@onedaywhenおっと、はい、私はDISTINCTを頭とキーボードの間のどこかに見失ってしまいました。どのデータベースを使用していますか?それでも、TSQLのサブセレクトと比較して3倍のパフォーマンス上の利点があるようです(もちろんデータ量は同じではないかもしれません) –

+0

私はAirplanesデータベースを使用しています; – onedaywhen