你可以在SQL中使用带EX的EXISTS吗?

时间:2012-03-10 23:28:23

标签: sql nested exists

好的问题是,我必须列出所有经过“丹尼尔约翰斯顿”评论的餐馆,或者都有“意大利语”和至少一个评分至少为4的餐馆。

我一直在尝试这个查询:

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 个答案:

答案 0 :(得分:1)

子查询很少能提供最佳性能,直接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';

简单演示here

作为对你的问题的更多回答,是的,你绝对可以将EXISTS与OR一起使用,你只需要在主查询和子查询之间保持你的名字,你的查询也应该正常工作。 / p>

答案 1 :(得分: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');

答案 2 :(得分:0)

我只能看到现有查询有一个问题,那就是在这个子查询中:

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。通常没有理由不使用OR将EXISTS与IN混合。当然,通过我的编辑,查询应该与MySQL或Trasact-SQL等公共语言实现一起使用。