在两个SQL表之间连接数据

时间:2013-03-06 23:43:27

标签: sql sql-server tsql

好吧,我不像我应该的那样精通SQL,但我熟悉Joins,Unions等工作方式......我无法为此提出解决方案。我试图从两个不同的表中获取数据,但是猴子扳手是右侧表格可能比我在结果集中实际需要的行数更多。我必须加入这两个表的唯一标准是电子邮件地址。这是代码:

CREATE TABLE #PPEInfo(StudentEmail nvarchar(128), StudentName nvarchar(128), DevUnits int)

INSERT INTO #PPEInfo (StudentEmail, DevUnits)
SELECT e.StudentEmail AS Email, sum(ck.DevelopmentUnits) AS DevUnits
FROM Enrollments e, CourseKeys ck
WHERE e.CertGenerated = 'true'
AND e.CourseId = ck.CourseId
GROUP BY e.StudentEmail
ORDER BY DevUnits DESC

SELECT p.StudentEmail, p.DevUnits, s.StudentName  
FROM #PPEInfo p
RIGHT OUTER JOIN Surveys s
ON p.StudentEmail = s.StudentEmail
ORDER BY DevUnits DESC, StudentName ASC

DROP TABLE #PPEInfo

问题是我收到了多个学生姓名,因为他们在提交时可能没有使用过相同的学生姓名。例如:

Email Address   James R. Salvati
Email Address   James Salvati

我提出的唯一解决方案是首先使用电子邮件地址填充临时表,然后使用“TOP(1)”查询Surveys表中的名称,以获得一个学生姓名。它确实有效,但它非常占用CPU,我正在处理大量的记录。这是代码(尽管我现在并不关心DevUnits只是试图想出一些东西):

CREATE TABLE #PPEInfo(ID int IDENTITY(1,1), StudentEmail nvarchar(128), StudentName nvarchar(128), DevUnits int)

INSERT INTO #PPEInfo (StudentEmail)
SELECT DISTINCT StudentEmail FROM Enrollments
WHERE CertGenerated = 'true'

DECLARE @rowID int
DECLARE @email nvarchar(128)

SET @rowID = (SELECT max(ID) FROM #PPEInfo)

WHILE (@rowID > 0)
BEGIN
    SET @email = (SELECT StudentEmail FROM #PPEInfo WHERE ID = @rowID)
    UPDATE #PPEInfo
    SET StudentName = (SELECT TOP(1) s.StudentName FROM Surveys s
                       WHERE s.StudentEmail = @email)
    WHERE ID = @rowID
    SET @rowID = @rowID - 1
END

SELECT * FROM #PPEInfo
ORDER BY DevUnits DESC

DROP TABLE #PPEInfo

我从来没有真正在其中一个主板上发帖。我通常会找到解决方案或数字,但这个只是超出我的SQL实力。

感谢!!!

2 个答案:

答案 0 :(得分:1)

这取决于您在多个名称时确定要选择的名称。一个可行的方法如下:

SELECT p.StudentEmail, p.DevUnits, MAX(s.StudentName)
FROM #PPEInfo p
RIGHT OUTER JOIN Surveys s
ON p.StudentEmail = s.StudentEmail
ORDER BY DevUnits DESC, StudentName ASC
GROUP BY p.studentEmail, p.devUnits

在这里,您通过电子邮件和单位进行分组,并抓住" MAX"学生姓名。

同样在第一个查询中,您应该停止使用隐式连接。

答案 1 :(得分:0)

如果我错了,请纠正我,但我很确定你可以做到这一点来达到你想要的目的:

select * from enrollments
inner join coursekeys on 
enrollments.studentemail = coursekeys.studentemail 
where coursekeys.studentname=(
    select top 1 studentname from coursekeys 
    where studentemail=enrollments.studentemail
);

我目前无权访问SQL Server,但我已经成功地在具有与您类似的表的MySQL服务器上实现了这一点。