0

我有一个很难回答的问题。我的数据库中有 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 系统可以提供我需要的东西,但我必须小心我的数据。

随着我越来越近,我会不断更新。

4

1 回答 1

0

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

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

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

SELECT 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;UNION SELECT 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) 为空));

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

于 2013-11-14T16:49:29.783 回答