2013-02-09 2 views
0

У меня проблема, когда у меня есть два отношения: один содержит атрибуты song_id, song_name, album_id, а другой - с именами album_id и album_name. Мне нужно найти имена всех альбомов, у которых нет песен в отношении песни. Проблема в том, что я могу использовать только Rename, Projection, Selection, Grouping (с суммой, min, max, count), Cartesian Product и Natural join. Я потратил много времени на это и буду признателен за любую помощь, которая указала бы мне в правильном направлении.Проблемы с нерегулярностью алгебраической алгебры

ответ

1

Как отметил @ErwinSmout, разница в этом, как правило, является простым способом. Но поскольку вы не можете использовать его, есть сложное обходное решение, использующее подсчеты. Я предполагаю, что каждый album_id, присутствующий в отношении песен, также присутствует в отношении albums.

PROJECT album_id из отношения композиций (обратите внимание, что реляционная алгебра PROJECT эквивалентна SELECT DISTINCT SQL). Я назову это отношение song_albums. Теперь давайте возьмем подсчет отношения albums, назовите это m и возьмите счет новой таблицы, вызовите это n.

Возьмите декартово произведение отношений с альбомами и отношение song_albums. Это новое отношение имеет m * n строк. Теперь, если вы сделаете подсчет, сгруппированный по album_name, каждый из m album_name будет иметь значение n. Не очень полезно.

Но теперь, мы SELECT из связей строк, где albums.album_id != song_albums.album_id. Теперь, если вы делаете подсчет, сгруппированный по album_name, количество для тех альбомов, которые не были в исходном соотношении songs, будет n, тогда как те, которые изначально были там, будут иметь счет меньше n, поскольку строки были бы удалены на основе о том, сколько песен с этим альбомом находилось в исходном соотношении songs.


Редактировать: Как оказалось, это не является строго реляционная-алгебра Решение: В SQL, 1 х 1 таблицы, такие, как один, содержащий n может просто рассматриваться как целое число и используется в сравнении равенства. Однако, согласно Википедии, selection должно провести сравнение двух атрибутов отношения, или атрибута, и константы .

Еще одно препятствие, которое будет решать другой плохо рекомендованный декартово произведение: мы можем взять декартово произведение отношения 1 x 1, содержащее n с нашим самым последним отношением. Теперь мы можем сделать правильный выбор реляционной алгебры, так как у нас есть атрибут, который всегда равен n.

Поскольку это получил довольно сложный, здесь реляционная-алгебра выражение захватывая выше английский объяснение:

relational algebra 1

relational algebra 2

relational algebra 3

relational algebra 4

Обратите внимание, что n - отношение 1 x 1 w с атрибутом с именем «count».

+1

Ничего себе. Если когда-либо есть конкурс «большинство искаженных SQL-решений», вам обязательно нужно присоединиться. Тем временем я откажусь от своего «невозможного» и утвержу, что учителя, которые учат своих учеников подобным вещам, должны быть подвешены с самого высокого дерева или, по крайней мере, должны быть удержаны от обучения в базе данных на всю оставшуюся жизнь. –

+0

Как я могу заняться последней частью в реляционной алгебре, так как n - произвольное число? –

+0

@CodeEnthusiast С более декартовым продуктом acrobatery! Хорошая уловка, я отредактировал решение для размещения для этого. Надеюсь, это чисто академическое упражнение. – DPenner1

0

Это невозможно. Проблема включает в себя отрицание и в реляционной алгебре, которая может быть заменена только с использованием реляционной разницы, которую вам, по-видимому, не разрешено использовать.

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

+0

Оказалось, что это действительно не "невозможно". См. Решение DPenner. –

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