sql - R) 在 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
等。这是一种风格,您可以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'
推荐阅读
- java - viewpager 错误的项目位置 pageradapter
- python - 网络爬虫不跟随链接
- php - Laravel:将变量传递给视图并将其作为函数中的全局变量访问
- javascript - 我需要比较两个字符串(或数组)并返回它们的相似度百分比,无论它们的顺序如何
- javascript - 如何以方程的形式产生两个值的输出,而不仅仅是输出?
- algorithm - 计算与 0 共享的矩阵中 1 的边数
- java - 是否可以将数组索引作为char?
- osrm - 在 OSRM 前端自定义 UI
- java - 我的矩阵乘法函数返回空白或不正确的输出
- angular - 如何在角度 6 中获取选择属性