将SQL查询转换为关系代数 - 无法弄清楚它

时间:2012-11-14 14:55:52

标签: sql relational-algebra

有人可以帮我解决这两个SQL语句的关系代数。我无法理解它

SELECT EMP.*
     , DEPT.DEPTNAME
     , DEPT.BUILDING
     , MANAGER.NAME DEPT_MANAGER
  FROM DEPT DEPARTMENT
     , EMPLOYEES EMP
     , EMPLOYEES MANAGER
 WHERE DEPT.DEPTMANAGERID = MANAGER.EMPID
   AND EMP.DEPTNO = DEPT.DEPTNO;

SELECT rep.repname SalesRep
     , prod.productno ProdID
     , prod.productname Name
     , prod.productdesc ProdDesc
     , prod.units Unit
     , prod.productprice Price
     , paint.*
     , chem.*
     , feed.*
     , sup.repname Supervisor
  FROM products prod
     , salesreps rep
     , salesreps sup
     , paintproducts paint
     , chemicalproducts chem
     , animalfeedproducts feed
 WHERE rep.salesrepid = prod.productsalesrepid
   AND rep.supervisor = sup.salesrepid (+)
   AND prod.productno = paint.productno (+)
   AND prod.productno = chem.productno (+)
   AND prod.productno = feed.productno (+);

我为第一个尝试了这个:

π emp.*, dept.deptname, dept.building, manager.name (Department |×| deptmanagerid = empid Employees) X (Employee |×| Emp.Deptno = Dept.DeptNo Department) 

(很抱歉不知道怎么改变布局让它看起来可读)不知道那是否是远程正确的,对于第二个我不知道从哪里开始

2 个答案:

答案 0 :(得分:0)

对于你的第一个查询,像你这样的接缝正在寻找经理的信息,你告诉我,如果我错过了理解,但是如何:

SELECT MANAGER.*
 , DEPT.DEPTNAME
 , DEPT.BUILDING
 , DEPT_MANAGER
FROM DEPT DEPARTMENT
 , EMPLOYEES MANAGER
WHERE DEPT.DEPTMANAGERID = MANAGER.EMPID
AND MANAGER.DEPTNO = DEPT.DEPTNO;

如果您想要经理的员工,您必须首先使用两个像您预期的表

答案 1 :(得分:0)

SQL查询块和关系代数之间的转换很简单:from子句是笛卡尔积,where子句列出限制(又称选择),select子句是投影,按照我刚刚描述的顺序应用。这些关系查询在文献中称为SPJ(select-project-join)或SPC。

带有外连接和关系代数的查询之间的转换没有意义:与wikipedia RA page相反,外连接(更不用说用oracle专有的容易出错的语法编写的连接)不属于标准关系代数。

P.S。 Latex会使您的关系代数查询可读。