繁体   English   中英

R) 在 R 中使用连接

[英]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 有误解。 我应该如何修复它们?

  1. 检索销售部门经理的就业编号。

     dbGetQuery(jamesdb, 'SELECT EMPLOYEE.EMP_NO FROM DEPARTMENT JOIN EMPLOYEE WHERE DEPARTMENT.NAME = "Sales"')
  2. 谁在 D2 部门工作?

     dbGetQuery(jamesdb, 'SELECT MANAGER FROM DEPARTMENT WHERE DEPT_NO = "D2"')
  3. 有多少白色产品有库存?

     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如果你愿意。

  • 我在这里介绍表别名( de ),这是一种缩短长表名的方法。 但是,它们是风格的,不是必需的。

  • 我个人不喜欢缺少外键字典并且有不直观的名称来关联它们的数据库。 例如,我从表的内容推断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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM