[英]R) Using join in R
鉴于数据库位于下方,
> dbReadTable(jamesdb, "EMPLOYEE")
EMP_NO NI_NO NAME AGE DEPT_NO
1 E1 123 SMITH 21 D1
2 E2 159 SMITH 31 D1
3 E3 5432 BROWN 65 D2
4 E5 7654 GREEN 52 D3
> dbReadTable(jamesdb, "DEPARTMENT")
DEPT_NO NAME MANAGER
1 D1 Accounts E1
2 D2 Stores E3
3 D3 Sales E5
> dbReadTable(jamesdb, "PRODUCT")
PROD_NO NAME COLOR
1 p1 PANTS BLUE
2 p2 PANTS KHAKI
3 p3 SOCKS GREEN
4 p4 SOCKS WHITE
5 p5 SHIRTS WHITE
> dbReadTable(jamesdb, "STOCK_TOTAL")
PROD_NO QUANTITY
1 p1 2000
2 p2 1000
3 p3 1500
4 p4 200
5 p5 800
下面是我到目前为止得到的,但我认为我对使用 join 有误解。 我应该如何修复它们?
检索销售部门经理的就业编号。
dbGetQuery(jamesdb, 'SELECT EMPLOYEE.EMP_NO FROM DEPARTMENT JOIN EMPLOYEE WHERE DEPARTMENT.NAME = "Sales"')
谁在 D2 部门工作?
dbGetQuery(jamesdb, 'SELECT MANAGER FROM DEPARTMENT WHERE DEPT_NO = "D2"')
有多少白色产品有库存?
dbGetQuery(jamesdb, 'SELECT SUM(QUANTITY) FROM PRODUCT JOIN STOCK_TOTAL WHERE PRODUCT.COLOR = "WHITE"')
连接通常是通过将一个表中的一个(或多个)字段与另一表的相应字段进行匹配来完成的。 例如,我推断DEPARTMENT.MANAGER
实际上是EMPLOYEE.EMP_NO
的外键,所以当你加入时,你应该非常具体地了解这种关系:
SELECT e.EMP_NO
FROM DEPARTMENT d
LEFT JOIN EMPLOYEE e on d.MANAGER = e.EMP_NUM
WHERE d.NAME = "Sales"
笔记:
许多数据库允许您马虎,它们将根据常见的字段名称推断字段关联(外键)。 首先,我不喜欢允许这种推断; 其次,它在这里不起作用。
我个人更喜欢明确连接的类型,无论是left join
还是inner join
等。这是一种风格,你可以选择 just join
如果你愿意。
我在这里介绍表别名( d
和e
),这是一种缩短长表名的方法。 但是,它们是风格的,不是必需的。
我个人不喜欢缺少外键字典并且有不直观的名称来关联它们的数据库。 例如,我从表的内容推断DEPARTMENT.MANAGER
链接到EMPLOYEE.EMP_NUM
。 如果我对这个推论有误,那么下面的答案可能会出现偏差。
但是,对于您的第一个问题,我不知道您为什么需要加入:由于MANAGER
已经是员工编号,因此应该很简单
select d.MANAGER
from DEPARTMENT d
where d.NAME='Sales'
同样,您的第二个问题也不需要加入。
select e.*
from EMPLOYEE e
where e.DEPT_NO='D2'
最后一个需要加入,可以通过多种方式完成。 其中之一是:
select sum(case when st.Quantity > 0 then 1 else 0 end) as Count
from STOCK_TOTAL st
left join PRODUCT pr on st.PROD_NO=pr.PROD_NO
where pr.COLOR='WHITE'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.