【问题标题】:R) Using join in RR) 在 R 中使用连接
【发布时间】:2021-05-31 07:08:23
【问题描述】:

鉴于数据库位于下方,

> 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"')
    

【问题讨论】:

    标签: sql r join left-join inner-join


    【解决方案1】:

    连接通常是通过将一个表中的一个(或多个)字段与另一表的相应字段进行匹配来完成的。例如,我推断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 joininner join等。这是一种风格,如果你愿意,你可以只选择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'
    

    【讨论】:

    • 由于您是 SO 新手,因此请求:当有人解决您的问题时,请accept it。这样做除了代表点之外做了很多事情,它还为有类似问题的后续读者提供了关闭。虽然不急于这样做,但请记住回来接受您喜欢的答案。既然您有couple of questions with unaccepted answers,请返回并考虑接受它们。谢谢。
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多