如何从另一个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为如果表T
和U
保持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表,但你可能要确保每个类真的需要第二个协调者,因为第二个连接应该是一个外部连接。 事实上,假设这不是必需的领域,可能会更安全。