【问题标题】:SQL - Get pairs for Employees of same city and first employee in pair takes a course taught by secondSQL - 为同一城市的员工获取配对,并且配对的第一个员工参加第二个教授的课程
【发布时间】:2017-02-02 09:40:04
【问题描述】:

我已经能够将其缩小到适当的对,但我完全不知道如何过滤最终部分。以下将范围缩小了一点,但仍然包含一对一起参加课程的人(其中一名员工是老师,但恰好与正在返回的其他员工一起参加课程):

select a.ID, b.ID 
from EM as a, EM as b, ER, CR 
where a.City = b.City and a.ID <> b.ID and a.ID = ER.ID and b.ID =  
      CR.Teacher_ID and a.ID < b.ID 
group by a.ID, b.id; 

我的桌子是:

EM - 包含字段ID、城市、姓名、部门、​​薪水的员工信息

ER - 使用字段 CnumID、Grade

的员工注册

CR - 包含字段 Cnum、Title、DEPT、Teacher_ID(匹配 EM.ID)的课程信息

粗体字段为主键

结果应如下所示:

ID  |  ID
---------
E1    E2
E10   E2

如果两个员工都来自同一个城市或多个城市,则该对中的第一个员工会从该对中的第二个员工那里学习课程。 除了我结束了

ID  |  ID
---------
E1    E2
E10   E2
E14   E2

我得到了一对来自同一个城市的员工(E14 和 E2),但第二个员工没有教第一个员工,他们只是碰巧和学生在同一个班级。

【问题讨论】:

  • 从不FROM 子句中使用逗号。 始终使用明确的JOIN 语法。
  • 能否提供一些你想要的小测试数据和输出

标签: mysql sql


【解决方案1】:

编辑简化并转储派生表。

SELECT DISTINCT
    em.ID as Employee
    ,cr.Teacher_Id as Teacher
FROM
    EM em
    INNER JOIN ER er
    ON em.ID = er.ID
    INNER JOIN CR cr
    ON er.Cnum = cr.Cnum
    INNER JOIN EM te
    ON cr.Teacher_Id = te.ID
    AND em.City = te.City

这将为您提供居住在同一城市的某些课程的所有员工和教师。 DISTINCT 在这里,以防他们实际上一起参加 2 门课程。

注意 E3 和 E12 与 E4 和 E13 一样也是匹配项,但它们未在您的示例结果中列出。

【讨论】:

  • 天才!有效。从来没有想过使用子查询作为连接。谢谢!
【解决方案2】:

试试这个可能会解决你的问题。

SELECT CR.Teacher_ID,ER.ID FROM EM
 INNER JOIN ER
 ON EM.ID=ER.ID
 INNER JOIN CR
 CR.CNUM=ER.CNUM
 AND CR.Teacher_ID=EM.ID

请回复.....

【讨论】:

  • 它返回一个空集
  • 好吧,其他答案呢?
  • 我已将 ER.Id 替换为 Em.Id 试试这个
  • 空集,你在第 5 行的开头忘记了一个“ON”
  • 哦,是的,我会仔细研究它并很快给出答案。
【解决方案3】:
select em.id,em2.id
from em join er on em.id=er.id join cr on er.cnum=cr.cnum 
join em as em2 on em2.id=cr.Teacher_ID where em.city=em2.city

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2017-07-16
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多