好吧,我不像我應該那樣精通SQL,但我很熟悉連接,聯盟等等是如何工作的,而且我不能提出解決方案爲了這。我試圖從兩個不同的表中獲取數據,但是猴子扳手是在我的結果集中右側表格可能比我實際需要的行數多。我必須加入這兩張表的唯一標準是電子郵件地址。代碼如下:在兩個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資源,而且我正在處理大量記錄。下面的代碼(雖然我不關心在這一點上只是想拿出東西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實力。
謝謝!
您使用的是哪個版本的SQL Server? – 2013-03-07 00:53:35