簡體   English   中英

在2個SQL表之間聯接數據

[英]Joining Data Between 2 SQL Tables

好的,我不像我應該的那樣精通SQL,但是我熟悉Joins,Union等的工作原理,而我只是無法提出解決方案。 我正在嘗試從兩個不同的表中獲取數據,但活動扳手是,右側表可能比我在結果集中實際需要的行多。 我必須加入兩個表的唯一條件是電子郵件地址。 這是代碼:

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

謝謝!!!

這取決於您要如何確定有多個名稱時要選擇的名稱。 一種可能的方法如下:

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

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

如果我錯了,請糾正我,但是我很確定您可以這樣做以實現您想要的目標:

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服務器上成功實現了此目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM