none
Задача на sql RRS feed

  • Вопрос

  • Подскажите решение задачи
    Имеются номинанты и лауреаты фильмов, необходимо найти такой фильм, который выигрывал все премии, в данном случае ответ: фильм 5. Все возможные премии содержатся только в "Номинант-фильм" в "Лауреат-фильм" может не быть какой-либо премии, но в данном примере все премии есть там.

Ответы

  • create table Challengers
    (
      Film  int
    , Award int
    )
    
    create table Winners
    (
      Film int
    , Award int
    )
    
    insert Challengers
    values( 5, 4), ( 5, 7), ( 12, 7), ( 100, 7)
    
    insert Winners
    values( 5, 4), ( 5, 7), ( 100, 7)
    
    select w.Film
    from Winners w
    group by w.Film
    having count(*) = (select count(distinct c.Award) from Challengers c) 

  • Ну и вариант на случай если

    1) По какой-то причине в таблице "Лауреат-фильм" могут появлиться дубли, т.е. один и тот же фильм с одним кодом премии

    2) Если в таблице "Лауреат-фильм" появится фильм с кодом премии, которого нет в таблице  "Номинант-фильм"

    select Film from
      (
        select Film, count( distinct Award ) as CntAward, max(allAwards) allAwards
          from Winners w
            cross apply ( select count( distinct Award ) allAwards 
                            from Challengers 
                        ) t
          where Award in ( select Award from Challengers )
          group by Film
      ) t
    where CntAward = allAwards

    Чтобы не делать этих проверок необходимо, чтобы у вас в таблицах были верные констрейнты и внешние ключи

    http://www.t-sql.ru

    Модератор

Все ответы

  • create table Challengers
    (
      Film  int
    , Award int
    )
    
    create table Winners
    (
      Film int
    , Award int
    )
    
    insert Challengers
    values( 5, 4), ( 5, 7), ( 12, 7), ( 100, 7)
    
    insert Winners
    values( 5, 4), ( 5, 7), ( 100, 7)
    
    select w.Film
    from Winners w
    group by w.Film
    having count(*) = (select count(distinct c.Award) from Challengers c) 

  • Ну и вариант на случай если

    1) По какой-то причине в таблице "Лауреат-фильм" могут появлиться дубли, т.е. один и тот же фильм с одним кодом премии

    2) Если в таблице "Лауреат-фильм" появится фильм с кодом премии, которого нет в таблице  "Номинант-фильм"

    select Film from
      (
        select Film, count( distinct Award ) as CntAward, max(allAwards) allAwards
          from Winners w
            cross apply ( select count( distinct Award ) allAwards 
                            from Challengers 
                        ) t
          where Award in ( select Award from Challengers )
          group by Film
      ) t
    where CntAward = allAwards

    Чтобы не делать этих проверок необходимо, чтобы у вас в таблицах были верные констрейнты и внешние ключи

    http://www.t-sql.ru

    Модератор