【问题标题】:Joining Data Between 2 SQL Tables连接 2 个 SQL 表之间的数据
【发布时间】:2013-03-07 07:55:37
【问题描述】:

好吧,我不像我应该的那样精通 SQL,但我熟悉联接、联合等的工作原理,但我就是想不出一个解决方案。我正在尝试从两个不同的表中获取数据,但猴子扳手是右侧表的行数可能比我在结果集中实际想要的行数多。我必须加入这两个表的唯一条件是电子邮件地址。代码如下:

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)”在“调查”表中查询姓名,只获得一个学生姓名。它确实有效,但它非常占用 CPU,而且我正在处理大量记录。这是代码(虽然我此时并不关心 DevUnit,只是想提出一些建议):

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 能力。

谢谢!!!

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

标签: sql sql-server tsql


【解决方案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”学生姓名。

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

【讨论】:

  • 谢谢安倍。这就像一个冠军。我从没想过对 char 类型使用 MAX。
  • 这样做让我很紧张,因为虽然电子邮件大部分仅由一个人使用……但不能保证。
【解决方案2】:

如果我错了,请纠正我,但我很确定你可以这样做来实现你想要的:

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 服务器上成功实现了这一点,该服务器与您的表相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2021-11-05
    • 2012-04-25
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多