2014-04-06 1 views
1

가정하자 나는이 테이블이 있습니다방법에서 적어도 X 값으로 where 절을 지정하는 중첩 된 선택

사람

id name 
-- ---- 
1 dude 
2 john 
3 doe 
...etc 

favourite_food

personid food 
-------- ------ 
    1  apples 
    5  apples 
    5  oranges 

를 내가 원하는 적어도 사람이 좋아하는 음식을 좋아하는 사람들의 이름 목록을 얻으십시오. 아래처럼 뭔가 :

SELECT p.name FROM person p 
LEFT JOIN favourite_food ff ON ff.personid = p.id 
WHERE ff.food = (SELECT food FROM favourite_food WHERE personid = 5) 
AND ff.personid <> 5; 

나는 적어도 '부분을 어떻게 지정 해야할지 모르겠다. 임시 테이블을 생성해야합니까?

답변

0

SQL은 기본적으로 세트로 작동하므로 세트 이론과 관련하여 문제를 엄격하게 재구성하는 데 도움이됩니다.

"최소한"은 다음과 같이 재구성 될 수 있습니다. 우리는 사람 5의 가장 좋아하는 음식 인 음식을 보았을 때, 사람은 사람 5와 같은 수의 좋아하는 음식을 먹었습니까?

SELECT name 
FROM person 
WHERE id IN (SELECT personid 
      FROM favourite_food 
      WHERE food IN (SELECT food 
          FROM favourite_food 
          WHERE personid = 5) 
      GROUP BY personid 
      HAVING COUNT(food) = (SELECT COUNT(food) 
            FROM favourite_food 
            WHERE personid = 5) 
      ) 

또는이 재구성을 사용 우리는 그 사람 5 좋아하는 음식을 좋아하지 않는 사람을 원하지않습니다. 따라서, 어떤 음식이 그 사람 5 좋아하지만, 그 사람이 좋아되지 존재하지 않는 모든 사람을 찾습니다

SELECT name 
FROM person 
WHERE NOT EXISTS (SELECT 1 
        FROM favourite_food AS person5_food 
        WHERE personid = 5 
        AND NOT EXISTS (SELECT 1 
            FROM favourite_food 
            WHERE personid = person.id 
             AND food = person5_food.food) 
       ) 

(사실, SQL은 relational algebra에 기반을하고 원하는 동작입니다 division이라고합니다.)