Какой правильный оператор SQL для достижения следующего результата - PullRequest
3 голосов
/ 14 июня 2011

У меня есть следующая таблица.

Owner_id    Owner
-----------------
1           Bill
2           Steve


Animal      Owner_fk_id
-----------------------
Cat         1
Dog         1
Lion        2

Car         Owner_fk_id
-----------------------
Ferrari     1
BMW         1
Lotus       2

Я хочу перечислить всех животных и автомобилей для владельца, у которого есть хотя бы 1 Ferrari.Поскольку у Билла есть Ferrari, мы перечислим все машины и животных Билла.

Если я использую следующий SQL:

SELECT *
    FROM Owner
    LEFT JOIN Animal ON (Animal.Owner_fk_id = Owner.Owner_id )
    LEFT JOIN Car ON (Car.Owner_fk_id = Owner.Owner_id )
    WHERE Car.Car = 'Ferrari'

, я получу

Owner       Animal  Car
---------------------------
Bill        Cat     Ferrari
Bill        Dog     Ferrari

Какой мой желаемый результат:

Owner       Animal  Car
---------------------------
Bill        Cat     Ferrari
Bill        Cat     BMW
Bill        Dog     Ferrari
Bill        Dog     BMW

Могу ли я узнать, какой правильный оператор SQL я должен использовать?

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Внутреннее объединение при вашем необходимом условии (т. Е. Car='Ferrari) и затем левое присоединение к другим таблицам, как и раньше.

SELECT o.Owner, a.Animal, c2.Car
FROM Owner as o
INNER JOIN Car as c1 on c1.Owner_fk_id = o.Owner_id and c1.Car='Ferrari'
LEFT JOIN Animal as a ON a.Owner_fk_id = o.Owner_id
LEFT JOIN Car as c2 ON c2.Owner_fk_id = o.Owner_id;
0 голосов
/ 14 июня 2011

Если Owner владеет несколькими Ferrari, и важно считать его только один раз, вы можете сделать что-то вроде этого:

SELECT subq.Owner, a.Animal, c2.Car FROM
    (SELECT o.* FROM Owner as o1 WHERE EXISTS
        (SELECT 1 FROM Car as c1
         WHERE c1.Owner_fk_id = o1.Owner_id
         AND c1.Car='Ferrari')
    ) as subq
LEFT JOIN Animal as a ON a.Owner_fk_id = subq.Owner_id
LEFT JOIN Car as c2 ON c2.Owner_fk_id = subq.Owner_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...