Как выбрать фамилии этих боксеров, которые никогда не проигрывали бой? - PullRequest
1 голос
/ 27 марта 2020

Я знаю, что мой вопрос очень странный, но я понятия не имею, как select должен выглядеть в oracle, если я хочу увидеть фамилии всех боксеров, которые никогда не проигрывали.

Итак, у меня есть:

  • таблица «боксер» со столбцами: id, fname, lname, weight.
  • таблица «бой» с двумя внешними ключами от таблицы boxer (id_boxer1 и id_boxer2) и с одним победителем столбца (если боксер1 выиграл, то победитель будет номером 1, если боксер2 выиграл, тогда победитель будет номером 2)

Как выбрать боксеров, которые никогда не проиграют бой в oracle? У меня есть oracle 11g Express Edition. (Нет, я не могу обновить, мой профессор сказал, что мои ответы должны работать на 11g).

Извините, если мой вопрос не соответствует условиям этой страницы.

РЕДАКТИРОВАТЬ:

Благодаря вашей помощи я достиг этого:

select b.lname
from boxer b
where 
    not exists (
        select 1 
        from fight f 
        where (f.id_boxer1 = b.id and winner = 2) or (f.id_boxer2 = b.id and winner = 1)
    )
    and exists (
        select 1 
        from fight f  
        where (f.id_boxer1 = b.id and winner = 1) or (f.id_boxer2 = b.id and winner = 2)
    )
    and not exists (
        select 1
        from fight f
        where (f.id_boxer1 = b.id and winner = 0) or (f.id_boxer2 = b.id and winner= 0)
    )

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Я бы использовал выражение case, чтобы получить проигравшего боксера из таблицы fight, а затем запросить таблицу boxer с помощью оператора not exists:

SELECT *
FROM   boxer b
WHERE  NOT EXIST (SELECT *
                  FROM   fight
                  WHERE  b.id = CASE winner WHEN 1 THEN id_boxer2 
                                            WHEN 2 THEN id_boxer1
                                END)

Примечание - если winner=0 (т. е. ни один боксер не выиграл), выражение can вернет null, которое никогда не может быть равно b.id.

0 голосов
/ 27 марта 2020

Вы можете использовать не существует:

select b.*
from boxer b
where not exists (
    select 1 
    from fight f 
    where (f.id_boxer_1 = b.id and f.winner = 2) or (f.id_boxer_2 = b.id and f.winner = 1)
)

Если вы хотели, чтобы боксеры, которые сражались хотя бы раз и , никогда не проигрывали:

select b.*
from boxer b
where 
    not exists (
        select 1 
        from fight f 
        where (f.id_boxer_1 = b.id and f.winner = 2) or (f.id_boxer_2 = b.id and f.winner = 1)
    )
    and exists (
        select 1 
        from fight f 
        where (f.id_boxer_1 = b.id and f.winner = 1) or (f.id_boxer_2 = b.id and f.winner = 2)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...