【问题标题】:SQL Join on match against every recordSQL Join 匹配每条记录
【发布时间】:2012-03-04 13:34:49
【问题描述】:

大家早上好, 我希望有人可以帮助我解决问题。我试图弄清楚如何找到哪些员工在每个项目中工作。

如果我有一个包含 ssn、project_id 和工作小时数列的works_on 表;以及一个带有 project_id、project_name、dept 的表项目。我需要知道哪些员工负责每个项目。

这是一个家庭作业问题,我应该用关系代数来做,但是普通的旧 sql 代码或任何关于如何做到这一点的想法都是一般性的,将不胜感激。我只是没看到...

感谢您的任何指点。

编辑:如果有人有任何 cmets/建议,这是我的最终版本。我想我明白了。此外,它与员工表连接以获取名称,这是作业规范中所要求的。

WORKS1 ← ρ (SSN, PNUMBER) π ESSN, PNO (WORKS_ON)
WORKS_DIV ← (PROJECT x WORKS1) – WORKS1
EMP_EVERY_PROJ ← WORKS1 – WORKS_DIV 
π FNAME, MINIT, LNAME (EMP_EVERY_PROJ ⋈ SSN=SSN EMPLOYEE)

【问题讨论】:

  • 为了引导您正确的方向,解决此问题的典型方法是使用 GROUP BYHAVING COUNT(distinct project_id) 过滤器
  • 您也可以搜索[sql-match-all]标记的问题。
  • Here 是一篇解释除法使用代数和 SQL 的文章。

标签: sql relational-algebra


【解决方案1】:

每个项目都有哪些员工参与

这是一个名为relational division 的讨厌问题。这是article with some solutions

【讨论】:

  • 这正是我所需要的。我想我可以从这里弄清楚。谢谢!
  • 这看起来对吗? WORKS1 ← ρ (SSN, PNUMBER) π ESSN, PNO (WORKS_ON) WORKS_DIV ← (PROJECT x WORKS1) – WORKS1 WORKS1 – WORKS_DIV
  • @Kevin:通常最好将复杂的后续信息添加到您的问题中(而不是在 cmets 中),以便您可以正确格式化。
  • 如果works1 是员工正在从事的项目;和works_div 员工没有从事的项目;那么在works1 但不在works_div 的人正在从事所有项目。可能是对的,但不确定:)
  • @Andomar 感谢您的帮助,我认为根据您所说的,我是对的。我将解决方案添加到主要问题,格式化。
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多