2013-03-06 11 views
1

好吧,我不像我應該那樣精通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實力。

謝謝!

+0

您使用的是哪個版本的SQL Server? – 2013-03-07 00:53:35

回答

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」學生姓名。

同樣在你的第一個查詢中,你應該停止使用隱式連接。

+0

謝謝安倍。這就像一個冠軍。我從來沒有想過對字符類型使用MAX。 – 2013-03-07 00:20:32

+0

我知道,有點奇怪,但它的作品。 – 2013-03-07 00:21:10

+0

讓我緊張做這件事,因爲雖然電子郵件*主要*僅由一個人使用......它不能保證。 – 2013-03-07 00:35:04

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服務器上實現了這一點,併爲您的表提供了類似的表格。