关系代数中“Exactly one”查询:如何获取仅拥有一辆蓝色汽车的人员信息
关系代数实现“仅拥有一辆蓝色汽车的人员”查询方案
传统的关系代数(你参考的《Fundamentals of Database Systems, 7th Edition (Global Edition)》中的定义)并不直接支持Count这类聚合操作,需要用基本运算组合来实现需求,具体步骤如下:
- 筛选所有拥有蓝色汽车的人员与车辆关联记录
先通过等值连接关联PEOPLE和CAR,再筛选出颜色为蓝色的记录:
BlueOwners = σ Color='Blue' (PEOPLE ⋈ (ID=PID) CAR)
- 找出拥有超过一辆蓝色汽车的人员ID
对BlueOwners做自连接,匹配同一人员的不同车辆记录,最后投影出这类人员的ID:
MultipleBlueOwners = π ID (σ (BO1.ID = BO2.ID) ∧ (BO1 ≠ BO2) (BlueOwners × BlueOwners))
注:BO1和BO2是BlueOwners的两个别名,用于区分自连接的两个副本。
- 筛选仅拥有一辆蓝色汽车的人员
从所有拥有蓝色汽车的人员中,排除掉拥有多辆蓝色汽车的人员:
SingleBlueOwners = π ID, Lastname, Firstname (BlueOwners) - π ID, Lastname, Firstname (BlueOwners ⋈ (ID=ID) MultipleBlueOwners)
- 最终投影所需字段
直接从SingleBlueOwners中提取姓名字段:
π Lastname, Firstname (SingleBlueOwners)
完整关系代数表达式
π Lastname, Firstname ( π ID, Lastname, Firstname (σ Color='Blue' (PEOPLE ⋈ (ID=PID) CAR)) - π ID, Lastname, Firstname ( σ Color='Blue' (PEOPLE ⋈ (ID=PID) CAR) ⋈ (ID=ID) π ID (σ (BO1.ID = BO2.ID) ∧ (BO1 ≠ BO2) (σ Color='Blue' (PEOPLE ⋈ (ID=PID) CAR) × σ Color='Blue' (PEOPLE ⋈ (ID=PID) CAR))) ) )
内容的提问来源于stack exchange,提问作者Jupiter
相关产品推荐
相关产品推荐

