Написание запроса в строго реляционной алгебре (КАК НЕ SQL/MYSQL)

Итак, вот три отношения:

Члены таблицы

Участники (member_id, имя, город, штат)

где member_id — первичный ключ

Таблица заимствована

Заем (borrow_id, lib_id, member_id)

где заимствованный_ид — первичный ключ

Библиотеки таблиц

Библиотеки (lib_id, lib_address, lib_city, lib_state)

где lib_id — первичный ключ

И lib_id, и member_id являются внешними ключами.

Поэтому я пытаюсь написать запрос, который находит всех членов member_id, которые взяли книгу в КАЖДОЙ библиотеке в своем городе. Это означает, что

members.city = libraries.lib_city AND members.state = libraries.lib_state

Я думал об использовании реляционного деления. Например, у вас есть отношение, состоящее из member_id и всех lib_id, у которых они позаимствовали книгу. И вы делите это на отношение, состоящее из всех lib_id в городе этого члена.

Однако я не понимаю, как написать это в терминах реляционной алгебры.

В mysql/sql это очень просто, но перевод в реляционную алгебру — вот где я застрял.


person Jessica Garrett    schedule 07.11.2012    source источник
comment
спасибо за редактирование .... но это совсем не помогает мне понять проблему...   -  person Jessica Garrett    schedule 07.11.2012


Ответы (1)


Одна из стратегий состоит в том, чтобы сопоставить COUNT(DISTINCT lib_id) на member_id с общим количеством COUNT(DISTINCT lib_id) на город. Если они равны, человек брал взаймы во всех библиотеках своего города.

Я думаю, что сработает следующее:

SELECT 
  member_id, 
  /* Total libraries borrowed from by member */
  COUNT(DISTINCT Borrowed.lib_id) AS num_libs_borrowed,
  /* Total libs in the member's city */
  COUNT(DISTINCT Libraries.lib_id) AS total_city_libs
FROM 
  Members
  /* JOIN the city between Members & Libraries */
  JOIN Libraries ON Members.city = Libraries.lib_city
  /* JOIN member to borrowed */
  JOIN Borrowed ON Members.member_id = Borrowed.member_id
GROUP BY member_id 
/* If the number of libs borrowed from = the total libs in the city... */
HAVING num_libs_borrowed = total_city_libs
person Michael Berkowski    schedule 07.11.2012