Можете ли вы использовать EXISTS с OR в SQL? - PullRequest
0 голосов
/ 11 марта 2012

Хорошо, поэтому вопрос гласит, что я должен перечислить все рестораны, которые были проверены «Дэниелом Джонстоном» или имеют тип «итальянский» и хотя бы один рейтинг по крайней мере 4.

Iпытался этот запрос:

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, и если я не могу, что было бы лучше?

Моя логика заключается в том, что я хочу, чтобы название ресторана было итальянским иимеет по крайней мере одну оценку обзора более 4, поэтому EXISTS подходит для этого, и использование двух EXISTS, похоже, не имеет никакого значения, поэтому я возвращаюсь к обычному вложенному запросу для второй части.Я много перепутал и не могу понять, в чем я не прав, поэтому любая помощь будет принята с благодарностью!

Ответы [ 3 ]

1 голос
/ 11 марта 2012

Подзапросы редко дают лучшую производительность, возможно, быстрее с прямым JOIN;это также облегчает именование с меньшим количеством конфликтующих имен (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';

Простая демонстрация здесь .

В качестве более точного ответа на ваш вопрос, да, вы определенно можете использовать EXISTS с ИЛИ, вы просто должны держать свои имена прямо между основным запросом и подзапросами, и запрос, который у вас есть, тоже должен работать нормально.

0 голосов
/ 11 марта 2012

Я вижу только одну ошибку в вашем существующем запросе, а именно в этом подзапросе:

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

... вам нужно указать , который rest_id вы хотите получить, т.е.

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

Сказав это, если вы выполняете этот запрос отдельно и он работает, как вы говорите, я не могу понять, почему, если вы не используете RDBMS, с которой я не знаком. Как правило, нет причин, по которым вы не можете смешивать EXISTS с IN, используя OR. Конечно, с моим редактированием запрос должен работать с распространенными языковыми реализациями, такими как MySQL или Trasact-SQL.

0 голосов
/ 11 марта 2012
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');
...