如何从另一个SQL表中为两个不同的列匹配数据:Inner Join和/或Union?

我有MS Access中的两个表,跟踪课程促进者和他们促进的类。 这两张表的结构如下:

tbl_facilitators

facilID -> a unique autonumber to keep track of individual teachers facilLname -> the Last name of the facilitator facilFname -> the First name of the facilitator 

tbl_facilitatorClasses

 classID -> a unique autonumber to keep track of individual classes className -> the name of the class (science, math, etc) primeFacil -> the facilID from the first table of a teacher who is primary facilitator secondFacil -> the facilID from the first table of another teacher who is backup facilitator 

我无法弄清楚如何编写一个Inner Join来以这种格式提取结果:

 Column 1: Class Name Column 2: Primary Facilitator's Last Name Column 3: Primary Facilitator's First Name Column 4: Secondary Facilitator's Last Name Column 5: Secondary Facilitator's First Name 

如果我只是要求主辅导员,或者只是要求辅助辅导员,我就能够得到正确的结果。 不过,我不能让他们两个都解决。

这是我的工作内部join:

 SELECT tbl_facilitatorClasses.className, tbl_facilitators.facilLname, tbl_facilitators.facilFname FROM tbl_facilitatorClasses INNER JOIN tbl_facilitators ON tbl_facilitatorClasses.primeFacil = tbl_facilitators.facilID; 

出于绝望,我也尝试了一个联盟,但没有按照我的希望行事。 非常感谢您的帮助。 在这一点上,我真的很努力取得进展。 我不经常使用SQL。

感谢@philipxy我想出了以下查询结束了工作:

 SELECT tblCLS.className, tblP.facilLname, tblP.facilFname, tblS.facilLname, tblS.facilFname FROM (tbl_facilitatorClasses AS tblCLS INNER JOIN tbl_facilitators AS tblP ON tblCLS.primeFacil=tblP.facilID) INNER JOIN tbl_facilitators AS tblS ON tblCLS.secondFacil=tblS.facilID; 

当在MS Access中执行多个内部联接时,需要使用括号… 如其他post所述。

每个基表都有一个语句模板,也就是谓词 ,通过列名参数化,我们通过这个模板将行放入或排除。 我们可以使用与SQL声明相似的谓词的简写forms。

 // facilitator [facilID] is named [facilFname] [facilLname] facilitator(facilID,facilLname,facilFname) // class [classID] named [className] has prime [primeFacil] & backup [secondFacil] class(classID,className,primeFacil,secondFacil) 

将一行插入一个谓词给出一个声明,即命题 。 作出真正命题的行放在一张桌子里,而那些制造虚假命题的行却不在。 (所以一个表格陈述了每一行的命题, 并且陈述了每一个缺席行的命题。)

 // facilitator f1 is named Jane Doe facilitator(f1,'Jane','Doe') // class c1 named CSC101 has prime f1 & backup f8 class(c1,'CSC101',f1,f8) 

但是每个表格expression式值都有一个谓词。 SQL被devise为如果表TU保持T(…)和U(…)(分别)的(不含NULL的非重复)行,则:

  • T CROSS JOIN U保存T(…)和U(…)
  • T INNER JOIN U ON condition包含T(…)和U(…)AND 条件的行
  • T LEFT JOIN U ON condition保存行(对于U列U1,…)
    T(…)和U(…)和条件
    或T(…)和不(U(…)AND 条件 )和U1是空的…
  • T WHERE condition包含T(…)AND 条件的行
  • T INTERSECT U保存T(…)和U(…)
  • T UNION U保存T(…)或U(…)
  • T EXCEPT U保存行T(…)AND NOT U(…)
  • SELECT DISTINCT * FROM T包含T(…)
  • SELECT DISTINCT columns to keep FROM T保存行在哪里
    那里有列删除这 (T)
  • VALUES (C1, C2, ...)(( v1 , v2 , ...), ...)包含行
    C1 = v1 AND C2 = v2 AND … OR …

也:

  • (...) IN T表示T(…)
  • scalar = T意味着T( 标量
  • T(…,X,…)AND X = Y表示T(…,Y,…)AND X = Y

因此,为了查询,我们find了一种方法,使用基表谓词来expression我们想要的自然语言行的谓词,然后使用基表谓词,然后在SQL中使用基表名(加上需要的条件)。 如果我们需要提两次表,那么我们给它别名。

 // natural language THERE EXISTS classID,primeFacil,secondFacil SUCH THAT class [classID] named [className] has prime [primeFacil] & backup [secondFacil] AND facilitator [primeFacil] is named [pf.facilFname] [pf.facilLname] AND facilitator [secondFacil] is named [sf.facilFname] [sf.facilLname] // shorthand THERE EXISTS classID,primeFacil,secondFacil SUCH THAT class(classID,className,primeFacil,secondFacil) AND facilitator(pf.facilID,pf.facilLname,pf.facilFname) AND pf.facilID = primeFacil AND facilitator(sf.facilID,sf.facilLname,sf.facilFname) AND sf.facilID = secondFacil // table names & (MS Access) SQL SELECT className,pf.facilLname,pf.facilFname,sf.facilLname,sf.facilFname FROM (class JOIN facilitator AS pf ON pf.facilID = primeFacil) JOIN facilitator AS sf ON sf.facilID = secondFacil 

当一个class不总是有两个辅导员,或者某些东西并不总是有全部名字的时候,就会使用OUTER JOIN。 (也就是说,如果一列可以是NULL)。但是你没有给出你的基表和查询的具体谓词,或者关于何时可能是NULL的业务规则,所以我没有假定NULL。

(重新MS访问JOIN括号从SO和这从MS看到这个 。)

只需为辅助服务人员额外join(请使用表格别名!):

 SELECT fc.className, f1.facilLname, f2.facilFname FROM tbl_facilitatorClasses fc INNER JOIN tbl_facilitators f1 ON fc.primeFacil = f1.facilID INNER JOIN tbl_facilitators f2 ON fc.secondFacil = f2.facilID; 

我会这样做,通过两次join到tbl_facilitators表,但你可能要确保每个类真的需要第二个协调者,因为第二个连接应该是一个外部连接。 事实上,假设这不是必需的领域,可能会更安全。