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

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

Так что я:

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

Как выбрать боксеров, которые никогда не проигрывают бой в оракуле? У меня есть оракул 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 ответа


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

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

Я бы использовал выражение 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 (т. b.id Ни один боксер не выиграл), выражение can вернет null , который никогда не может быть равен b.id


Есть идеи?

10000