2012-03-10 1 views
0

그래, "다니엘 존스턴"이 검토 한 레스토랑 중 "이탈리아어"유형과 적어도 4 점 이상의 평가 점수가 모두있는 레스토랑을 나열해야한다는 질문이 있습니다.EXISTS를 OR과 함께 SQL에 사용할 수 있습니까?

이 쿼리를 시도하는 중 :

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'); 

하지만 오류가 계속 발생합니다. 나는 다른 부분을 따로 따로 달리게했다. 그리고 그들은 ok 다. 그래서 나는 EXISTS와 OR을 사용할 수 없는지 궁금 해서요. 만약 내가 할 수 없다면, 더 좋은 방법은 없을까요?

내 논리는 그것이 이탈리아어이고 적어도 하나 이상의 리뷰 점수가 4 이상이므로 식당의 이름을 원한다는 것입니다. 따라서 EXISTS가 적합하며 두 개의 EXISTS를 사용하면 차이가없는 것처럼 보입니다. 왜 두 번째 부분에 대한 일반 중첩 쿼리로 되돌립니다. 나는 많은 것을 엉망으로 만들었고 내가 틀린 곳을 알아낼 수 없다. 그래서 어떤 도움이라도 대단히 감사하게 될 것이다!

+3

발생하는 오류를 확인하는 것이 도움이 될 수 있습니다. 또한, 어떤 RDBMS를 사용하고 있습니까? –

+0

왜'rest_id IN (...)'을 두 번 사용할 수 없습니까? –

답변

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 를 지정해야합니다 즉,

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

는 별도로 해당 쿼리를 실행했습니다 당신이 말하는대로, 일 않다면 왜 당신은 RDB를 사용하지 않는, 내가 꽤 알아낼 수 없습니다, 그런 말로 미루어 MS 나는 익숙하지 않다. OR을 사용하여 EXISTS를 IN과 혼합 할 수없는 이유는 일반적으로 없습니다. 필자가 편집 한 내용은 MySQL 또는 Trasact-SQL과 같은 공통 언어 구현에서 작동해야합니다.

+0

오픈 오피스 Base를 사용하고 있었는데 Access를 사용했고 쿼리가 잘 돌아갔습니다. 대답 주셔서 감사합니다 :) – user1261648

+0

아, 그래. OpenOffice Base는 내가 경험 한 것을 기억하고, 공정한 몇 군데에서 이상한 약간의 끔찍한 일이다. 그러나 내 경험은 꽤 오래된 것입니다 ... –

1

서브 쿼리는 드문 경우가 아닌 최상의 성능을 제공하는 경우는 거의 없습니다. 그것은 또한

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'; 

(귀하의 예제에서 내부 쿼리 중 하나가 아닌 확실한 방법으로 rest_id 충돌) 적은 충돌하는 이름을 가진 쉽게 명명 간단한 데모 here한다.

귀하의 질문에 대한 답을 밝히기 위해 네가 확실히 OR로 EXISTS를 사용할 수 있습니다. 기본 쿼리와 하위 쿼리 사이에 이름을 그대로두면 쿼리가 제대로 작동합니다.

+0

클래식 오류 : 결과에 더 많은 행이 있고 추가 조사 결과에 중복 행이 포함되어있어 더 이상 관계형 데이터가 없음을 보여줍니다. 'DISTINCT' 키워드를 추가하면 모든 SQL 제품에 대해 비슷한 효과가 있습니다. – onedaywhen

+0

@onedaywhen 예, 머리와 키보드 사이의 DISTINCT를 잃어 버렸습니다. 어떤 데이터베이스를 사용하고 있습니까? 그것은 여전히 ​​subselects에 비해 TSQL에서 ~ 3 배의 성능 이점을 제공하는 것 같습니다 (물론 같은 양의 데이터가 없을 수도 있습니다) –

+0

나는'Airplanes' 데이터베이스를 사용하고 있습니다.) – onedaywhen