2015-03-03 3 views
0

Я следую онлайн-курсу по базам данных. Тем не менее, я действительно не знаю, что следующий шаг и как я могу ответить на этот вопрос. Кто-нибудь может помочь? Это то, что у меня есть до сих пор.FOR ALL/EXIST Запросы

SELECT P.name 
FROM Persons P 
LEFT JOIN Knows K ON K.personA_id = P.id 
WHERE K.age >= P.age 

enter image description here

ответ

2

Попробуйте это:

SQL Fiddle

SELECT distinct P1.name 
FROM Persons P1 
INNER JOIN Knows K ON K.personA_id = P1.id 
INNER JOIN Persons P2 ON K.personB_id = P2.id AND P1.age - P2.age > 5 

Он будет выводить все, что знает, 1 человек или более (Persona) и что каждый человек, известный более чем на 5 лет моложе (personB)

+0

Большое спасибо за вашу помощь! Часть списка, который он возвращает, верна, но она пропускает одно имя, которое на пять лет старше. Вы знаете, почему это может быть? – dreamer

+0

Ваш вопрос сказал «старше 5 лет», поэтому, если ему 5 лет, он не включен –

+0

Да, вы правы. Но могли бы вы также показать мне, как это будет сделано, если будет включено 5 лет? – dreamer

0
SELECT p.name 
FROM Persons p 
WHERE p.age > 
    ((SELECT p1.age 
    FROM persons p1 
    INNER JOIN knows k 
    ON p1.id = k.personB_id) 
    + 5) 

Нечто похожее на это должно работать. Я не тестировал это, но основная идея есть. Вы должны сравнить возраст таблицы 1 с возрастом всех, известных в таблице 1, запустив дополнительный запрос в таблице 2. Существуют и другие способы, но это было проще всего. Попробуйте и дайте мне знать, если вы получите какие-либо ошибки. Наслаждайтесь :)

+0

Большое вам спасибо за помощь! Я получаю сообщение об ошибке «Подзапрос возвращает более 1 строки». Вы знаете, что это может быть? – dreamer

+0

Подзапрос возвращает несколько строк, потому что известно несколько людей. С реальными таблицами трудно думать, но это должно быть что-то близкое к этому. Вы знакомы с 'IN'? – b3tac0d3

+0

Я знаю, что это такое, но я думаю, что это упражнение не хочет, чтобы я его использовал. Есть ли у вас какие-либо другие предложения, чтобы исправить это? – dreamer

1

Название вопроса, относящегося к использованию ALL/EXISTS. Вот подходы, которые на самом деле это делают:

/* all */ 
select p.name 
from Persons as p 
where p.age - 5 > all (
    select p2.age 
    from 
     Knows as k inner join 
     Persons as p2 
      on p2.person_id = k.personB_id 
    where p2.id = p.id 
) 

/* not exists */ 
select p.name 
from Persons as p 
where not exists (
    select p2.age 
    from 
     Knows as k inner join 
     Persons as p2 
      on p2.person_id = k.personB_id 
    where p2.id = p.id 
     and p2.age > p.age - 5 
) 
Смежные вопросы