在关系代数中找到最大值
Find a Max in relational algebra
我在一道作业题上遇到了麻烦,我发现很难理解该怎么做背后的逻辑。
问:写一个查询,列出购买了最贵书的顾客的姓名和书名。
关系模式
客户(CID、姓名、地址)
订单(Ordernum,CID,Order_date,Cardnum)
订单列表(订单号、ISBN、数量、Ship_date)
图书(ISBN、书名、作者、Qty_in_stock、价格)
这是我的尝试:
rename(expensive,projection cid (orders) join Orderlist join (selection price < d.price ((book) cross-product Pd Book))
exp - 预测价格(书籍)
投影名称客户加入exp
您对 cross-product 和价格比较的尝试表明您的思考方向是正确的,但还不完全正确。在你获得所有存在便宜书的书之后,你如何获得不存在便宜书的书?从内到外工作,您需要在加入 Orderlist
、Orders
和 Customer
寻找买家之前做到这一点。
注意语法和操作顺序。实际上,您的答案很难理解。例如,Pd
、d
和 exp
是什么?为什么将某些内容重命名为 expensive
然后从不使用该术语?如果 projection cid (orders)
和 Orderlist
两个表达式没有共同的属性,如何连接?写出每个 sub-expression 的结果的 header(从内到外工作)应该有助于可视化操作顺序。
当您想要将一个复杂的 RA 表达式分解为多个步骤时,您可以将一个表达式的结果分配给一个变量以在下一个表达式中使用。请记住,这就像小学时的代数,只是具有更复杂的值和运算符。
T1(price)<--Ƴmax(price)(Book)
T2<--Πisbn,title,price(Book natural join T1)
T3<--(T2 natural join orderlist) natural join orders
T4<--πname,title(T3 natural join Customer)
我在一道作业题上遇到了麻烦,我发现很难理解该怎么做背后的逻辑。
问:写一个查询,列出购买了最贵书的顾客的姓名和书名。
关系模式 客户(CID、姓名、地址)
订单(Ordernum,CID,Order_date,Cardnum)
订单列表(订单号、ISBN、数量、Ship_date)
图书(ISBN、书名、作者、Qty_in_stock、价格)
这是我的尝试:
rename(expensive,projection cid (orders) join Orderlist join (selection price < d.price ((book) cross-product Pd Book))
exp - 预测价格(书籍)
投影名称客户加入exp
您对 cross-product 和价格比较的尝试表明您的思考方向是正确的,但还不完全正确。在你获得所有存在便宜书的书之后,你如何获得不存在便宜书的书?从内到外工作,您需要在加入 Orderlist
、Orders
和 Customer
寻找买家之前做到这一点。
注意语法和操作顺序。实际上,您的答案很难理解。例如,Pd
、d
和 exp
是什么?为什么将某些内容重命名为 expensive
然后从不使用该术语?如果 projection cid (orders)
和 Orderlist
两个表达式没有共同的属性,如何连接?写出每个 sub-expression 的结果的 header(从内到外工作)应该有助于可视化操作顺序。
当您想要将一个复杂的 RA 表达式分解为多个步骤时,您可以将一个表达式的结果分配给一个变量以在下一个表达式中使用。请记住,这就像小学时的代数,只是具有更复杂的值和运算符。
T1(price)<--Ƴmax(price)(Book)
T2<--Πisbn,title,price(Book natural join T1)
T3<--(T2 natural join orderlist) natural join orders
T4<--πname,title(T3 natural join Customer)