2013-09-11 6 views
3

Я не был уверен, что назвать эту проблему, но это не совсем счет строк. Допустим, мы имеем соотношение:Реляционная алгебра для подсчета строк

Competition(compId, sport, playerName, medal) 

И допустим атрибут медаль может быть золото, серебро, бронза, или нуль. Итак, мы имеем следующие данные:

(193, Tennis, John Doe, Gold) 
(931, Skiing, Mary White, Bronze) 
(193, Tennis, Arnold Black, null) 
(182, Bobsledding, John Doe, Gold) 
(901, Ping-Pong, Adam Brown, Silver) 
(248, Bobsledding, Mary White, Silver) 

Я имею очень трудно понять, как ответить на этот вопрос: Получить имена всех игроков, которые выиграли больше, чем одну медаль. В этих данных будут ответы Джон Доу и Мэри Уайт. Как я могу получить этот ответ на произвольные данные для этого отношения, используя реляционную алгебру?

(Это упрощенная версия фактической домашней проблемы, и это упрощение представляет (я надеюсь) часть этой проблемы, с которой я борюсь. Существует произвольное и неизвестное количество соревнований, спортивных состязаний и игроков, но только 4 возможности для медали)

+2

Не думайте о подсчете строк. Подумайте о возможности самостоятельного присоединения. – sqlvogel

+0

Сгруппировало бы работу для вас в этом случае? Совокупность имен игроков, а затем фильтра. Например, операция агрегации по схеме (A1, A2, ...An) будет: G1, G2, ..., Gm g f1 (A1 '), f2 (A2'), ..., fk (Ak ') (r) Ссылка: http: //en.wikipedia .org/вики/Relational_algebra –

+0

не реляционная алгебра, но в SQL, это выглядит следующим образом: ВЫБРАТЬ Playername, COUNT (*) от конкуренции GROUP BY Playername HAVING COUNT (*)> 1 – cliffordheath

ответ

1

Получите имена всех игроков, выигравших более одной медали.

(Это не ясно, что это значит. Победили чем один вид медали? Или получили более одной медали? Ваш пример ответа предполагает последнего. Кроме того, оно относится к «нулю», как только другой вид медали , не специально, как в SQL)

-- rows where 
    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT 
     in competition [compId] of sport [sport] player [playerName] won [medal] 
    AND in competition [compId2] of sport [sport2] player [playerName] won [medal2] 
    AND (compId <> compId2 OR sport <> sport2 OR medal <> medal2) 

Используя заявление стенографии:.

-- rows where 
    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT 
     Competition(compId, sport, playerName, medal) 
    AND Competition(compId2, sport2, playerName, medal2) 
    AND (compId <> compId2 OR sport <> sport2 OR medal <> medal2) 

Перегруппировка (предвидя ограничения одного сравнения на σ и один набор атрибутов в ∪):

-- rows where 
    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT 
     ( Competition(compId, sport, playerName, medal) 
     AND Competition(compId2, sport2, playerName, medal2) 
     AND compId <> compId2) 
    OR ( Competition(compId, sport, playerName, medal) 
     AND Competition(compId2, sport2, playerName, medal2) 
     AND sport <> sport2) 
    OR ( Competition(compId, sport, playerName, medal) 
     AND Competition(compId2, sport2, playerName, medal2) 
     AND medal <> medal2) 

Теперь, чтобы получить алгебру заменить:

  • каждое заявление своей таблицы/отношения
  • каждый и таблицы/соотношение по ⋈ (естественное соединение)
  • каждый OR таблицы/отношения (которые должны иметь одинаковые столбцы/атрибуты) с помощью ∪ (union)
  • каждый AND NOT (который должен иметь одинаковые столбцы/атрибуты) на \ (разность)
  • каждый AND сравнение на сг сравнения (выбрать/ограничения)
  • каждый СУЩЕСТВУЕТ имена уронить на я имена держать (проекцию)
  • каждый столбец/атрибут переименования через р (переименовать).

    π playerName (
        ( Competition 
        ⋈ σ compId <> compId2 ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition) 
    ∪ ( Competition 
        ⋈ σ sport <> sport2 ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition) 
    ∪ ( Competition 
        ⋈ σ medal <> medal2 ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition) 
    ) 
    

(подробнее см this answer.)

Смежные вопросы