如何在关系代数查询中使用变量?

How can I use a variable in a relational algebra query?

我有以下table

我想在查询中找到以下内容:

保留 ONLY Brown 保留的船只的水手姓名(意味着只有 Brown 和 Blake 应该出现,因为他们是唯一单独保留 Boat 1 和 Boat 的人4 在预订 table).

我已经尝试了以下方法,甚至使用了 relational algebra calculator 但是我被卡住了。我能够到达 table 中所有行都包含正确船只的地步,但是我不知道如何排除在其之上有额外船只的条目。所有帮助将不胜感激。谢谢

X = π SN, BN (Reservation) ⨝ π SN, Name (Sailer)
Y = π SN, BN (Reservation) ⨝ π BN (Boat)
Z = X ⨝ Y

CONTAINING = π Name, SN, BN (Z) / π BN (σ Name = 'Brown' (Z)) ⨝ Z
LAST = CONTAINING - π SN, BN, Name (σ Name = 'Brown' (Z))
RESERV = γ Name; count(Name)->NUM_RESERV (CONTAINING)
π Name (σ NUM_RESERV = NUM_RESERV RESERV)

这会产生:

Sailer.Name:
Smith
Blake
Brown

这是解决方案的草图:

  1. reserved-by-browntable由布朗保留的船的BN组成;这可以通过加入三个 tables 来找到,对水手姓名有限制,对 BN 有投影。

  2. sailstable由tablereserved-by-brown划分在SN和BN上的投影得到Reservation。这将产生 至少 保留了布朗保留的所有船的水手的 SN。

  3. non-brown得到Boat在BN上的投影与reserved-by-brown的差值table:这包含boat的所有BN 由 Brown 保留。

  4. non-brown-reservationnon-brownreservation之间加入属性BN。这包含所有的预订,不包括布朗预订的船只。

  5. 最后,计算帆与前一个table non-brown-reservation在SN上的投影之间的差异。这将包含所需的结果。