MSAccess 将 2 个表合并为 1 个,没有空格

Posted

技术标签:

【中文标题】MSAccess 将 2 个表合并为 1 个,没有空格【英文标题】:MSAccess Merging 2 tables into 1 with no blanks 【发布时间】:2013-11-14 14:50:11 【问题描述】:

我有一个很难回答的问题。我的数据库中有 2 个表,数据来自某些程序中分配给学生的笔记本电脑:

表 1 包含以下信息:型号、SiteID、SiteName、ServiceTag、AssetTag、Floor、Room、FirstName、LastName、STUDENTID、Grade

表 2 包含以下信息:SiteID、SiteName、LastName、FirstName、Grade、STUDENTID

表 1 包含来自去年名册的数据,包括学生及其分配的计算机。表 2 列出了该计划中的新学生名单。表 2 中的一些学生与表 1 中的学生相匹配(仍在该计划中的学生),但也有一些不匹配。

我需要执行以下操作:获取表 2 上的所有学生,并为他们分配一台机器,该机器已经在所述 SiteID(机器所在的学校),同时考虑到一些学生仍在计划中他们将相同的机器分配给他们,并在我需要为额外的学生部署新机器的地方留空。

我试图在此处插入图像以显示示例,但它不允许我这样做。如果您能帮助我,我很乐意通过电子邮件向您发送一个包含数据的基本示例。

编辑 1: 到目前为止,我能够得到一个查询,将仍在程序中的学生还给我,并给他们最初分配的机器,但其他机器没有分配给他们的学生,我试图弄清楚如何填写其他机器的数据与新生的名字。请记住,我正在处理多所学校,并且机器无法从一所学校转移到另一所学校,如果新名册中的学生比以前更多,那么我将不得不让这些学生没有分配给他们的机器并部署新系统。

编辑 2: 下面是表格的 CSV 版本以及我想要得到的结果。

TABLE 1
MODEL,SITE_ID,SITENAME,SERVICETAG,ASSETTAG,FLOOR,ROOM,FIRSTNAME,LASTNAME,STUDENTID,GRADE
6420,123,MY SCHOOL,1234GM1,AT0012345,1,102,PETER,PEREZ,100123456,1
6420,123,MY SCHOOL,5678GM1,AT0012346,1,102,PAUL,ANDREWS,100123457,1
6420,123,MY SCHOOL,1234FH1,AT0012347,1,102,JOHN,BERRONDO,100123458,3
6420,123,MY SCHOOL,5678FH1,AT0012348,1,102,ANDREW,JONES,100123459,3
6420,123,MY SCHOOL,12344K1,AT0012349,1,102,JONATHAN,DOE,100123460,4

TABLE 2
SITEID,SITENAME,FIRSTNAME,LASTNAME,STUDENTID,GRADE
123,MY SCHOOL,PAUL,ANDREWS,100123457,2
123,MY SCHOOL,JOHN,BERRONDO,100123458,4
123,MY SCHOOL,ANGEL,YOUNG,100123470,1
123,MY SCHOOL,TANIA,MATTHEWS,100123471,1
123,MY SCHOOL,GEORGE,PEREZ,100123472,2
123,MY SCHOOL,WALTER,DOE,100123473,2
123,MY SCHOOL,MATTHEW,PETERS,100123474,3

RESULTING TABLE
SITE ID,SITENAME,SERVICETAG,ASSETTAG,FIRSTNAME1,LASTNAME2,STUDENTID,GRADE
123,MY SCHOOL,5678GM1,AT0012346,PAUL,ANDREWS,100123457,2
123,MY SCHOOL,1234FH1,AT0012347,JOHN,BERRONDO,100123458,4
123,MY SCHOOL,1234GM1,AT0012345,ANGEL,YOUNG,100123470,1
123,MY SCHOOL,5678FH1,AT0012348,TANIA,MATTHEWS,100123471,1
123,MY SCHOOL,12344K1,AT0012349,GEORGE,PEREZ,100123472,2
123,MY SCHOOL,,,WALTER,DOE,100123473,2
123,MY SCHOOL,,,MATTHEW,PETERS,100123474,3

我尝试了以下 SQL 查询:

SELECT table2.SITEID, table2.SITENAME, table2.LASTNAME, table2.FIRSTNAME, table2.GRADE, table2.STUDENTID, table1.SERVICETAG, table1.ASSETTAG, 
FROM 
table2 LEFT JOIN table1 ON table2.STUDENTID=table1.STUDENTID;

此查询为我提供了名册上学生的完整列表,对于那些与他们保留机器的旧数据相匹配的学生,其余的留空。

SELECT table1.[SITEID], table1.[SITENAME], table1.[SERVICETAG], table1.[ASSETTAG]
FROM table1 LEFT JOIN [query 1] ON table1.[SERVICETAG] = [query 1].[SERVICETAG]
WHERE ((([query 1].[SERVICETAG]) Is Null));

这给了我尚未分配给新名单中任何学生的机器。

SELECT table2.SITEID, table2.SITENAME, table2.LASTNAME, table2.FIRSTNAME, table2.GRADE, table2.STUDENTID
FROM table2 LEFT JOIN table1 ON table2.STUDENTID= table1.STUDENTID
WHERE (((table1.STUDENTID) Is Null))
ORDER BY table2.SITEID;

这个给我没有匹配计算机的学生(换句话说,需要分配给他们的机器的学生)

如您所见,我拥有介于两者之间的所有内容,如果我最终能够加入这些数据并获得 CSV 结果演示中显示的结果,那就太好了。

更新 3: 我决定暂时采用 excel 方式,它变成了半自动半手动。我使用的 VLOOKUP 系统可以满足我的需求,但我必须小心我的数据。

我会随着距离越来越近而不断更新。

【问题讨论】:

不只是查询,难道不能直接使用 Make Table 来创建一个不包含现有学生的新表吗? 问题是我需要能够将学校中已有的机器分配给新的学生名册,并考虑到一些学生今年从以前的名册回来。 那么您是否只是想避免手动执行所有这些操作?因为我很确定您可以根据明年的列表查询包含重复出现的学生的表。然后制作另一个不出现重复学生的表格。之后合并这两个。这样一来,您就可以保留旧表格以备不时之需查找旧数据,并为每所学校每年创建一个新表格。 【参考方案1】:

您熟悉 UNION 查询吗?这对你来说可能是最简单的路径。这不是一个真正的答案,但我还不能发表评论,所以这就是我所拥有的。本质上,您使用(最好)相同数量的相似数据列创建两个查询,但每个查询都可以有不同的标准;如 选择StudentID, AssetTag from Table1 Inner Join Table2 On Table1.StudentID = Table2.StudentID 联盟 Select Table2.StudentID, Table1.AssetTag From Table2 Left Join Table1 On Table2.StudentID = Table1.StudentID where Table1.StudentID is null

不确定这是否 100% 准确,但希望您能明白这一点。创建两个查询,匹配列,并在 SQL 视图中使用单词“UNION”连接它们

这是您提供的数据结构中的联合:

选择 tble1.Model, tble1.Site_ID, tble1.SiteName, tble1.ServiceTag, tble1.AssetTag, tble1.Floor, tble1.Room, tble1.FirstName, tble1.LastName, tble1.StudentID, tble1.Grade FROM tble1 INNER JOIN tble2 ON tble1.StudentID = tble2.StudentID; 联盟 选择 tble1.Model、tble1.Site_ID、tble1.SiteName、tble1.ServiceTag、tble1.AssetTag、tble1.Floor、tble1.Room、tble2.FirstName、tble2.LastName、tble2.StudentID、tble2.Grade FROM tble1 RIGHT JOIN tble2 ON tble1.StudentID = tble2.StudentID WHERE (((tble1.StudentID) 为空));

要接近,我担心您需要手动输入。对不起。

【讨论】:

我尝试了一个 UNION 但它一直给我一个关于 JOIN 命令的错误。 你能发布SQL吗?这将有助于获取正确的详细信息。 嗯,非标准化数据对于这类事情是有问题的。问题是您无法(无论如何我都可以看到)将传入的学生与“未分配”的计算机相匹配。没有任何东西可以链接它们,如果没有该链接,您将拥有笛卡尔连接,虽然在某些规范中很有用,但在这里会很糟糕。您可以使用 VBA 来完成,编写一个循环语句来遍历可用资产,但我怀疑这不是您想要的。我将在上面提到的联盟附加我的“答案”,但它仍然需要手动更新资产数据。

以上是关于MSAccess 将 2 个表合并为 1 个,没有空格的主要内容,如果未能解决你的问题,请参考以下文章

(急)4个excel数据表合并成1个表

使用 MS Access Union Query 合并 3 个表/查询

如何将没有公共列的 2 个表合并到 SSIS 中的 1 个表中?

如何将 SQL 中的 2 个表与 1 个公共列组合在一起,而其他列中没有关系?

如何合并 2 个表的结果

Java - 合并来自不同数据源中的 2 个表的数据