2012-08-01 47 views
0

如何從具有左連接的select語句中選擇一個Distinct值? 我之後的值是來自trainingTbl的s_id或來自setsTbl的setName之一。與左連接的select語句不同

下面提供了完整的字符串。

Dim strQuery As String = 
    "SELECT * 
    FROM userAssessmentTbl 
    LEFT JOIN trainingTbl ON userAssessmentTbl.tt_id = trainingTbl.tt_id 
    LEFT JOIN setsTbl ON trainingTbl.s_id = setsTbl.s_id 
    LEFT JOIN outcomesTbl ON userAssessmentTbl.o_id = outcomesTbl.o_id 
    WHERE UserId = @UserId 
    ORDER BY t_date DESC " 

回答

0

GROUP BY嘗試的唯一性

SELECT * 
FROM userAssessmentTbl 
LEFT JOIN trainingTbl ON userAssessmentTbl.tt_id = trainingTbl.tt_id LEFT JOIN setsTbl ON trainingTbl.s_id = setsTbl.s_id 
LEFT JOIN outcomesTbl ON userAssessmentTbl.o_id = outcomesTbl.o_id 
WHERE UserId = @UserId 
GROUP BY trainingTbl.s_id 
ORDER BY t_date DESC 
+1

該代碼不會在大多數數據庫中工作。 MYSql允許它。 – HLGEM 2012-08-01 15:47:28

0

試試這個

SELECT DISTINCT trainingTbl.s_id FROM 
userAssessmentTbl LEFT JOIN trainingTbl ON userAssessmentTbl.tt_id = trainingTbl.tt_id 
LEFT JOIN setsTbl ON trainingTbl.s_id = setsTbl.s_id 
LEFT JOIN outcomesTbl ON userAssessmentTbl.o_id = outcomesTbl.o_id 
WHERE UserId = @UserId ORDER BY t_date DESC 

或這(不知道你需要什麼)

SELECT DISTINCT trainingTbl.s_id, setsTbl.setName FROM 
userAssessmentTbl LEFT JOIN trainingTbl ON userAssessmentTbl.tt_id = trainingTbl.tt_id 
LEFT JOIN setsTbl ON trainingTbl.s_id = setsTbl.s_id 
LEFT JOIN outcomesTbl ON userAssessmentTbl.o_id = outcomesTbl.o_id 
WHERE UserId = @UserId ORDER BY t_date DESC 
0

首先你問題在於你重新使用select *(一個SQL反模式和某些永遠不會出現在生產代碼中的東西),因此每個記錄都是唯一的,因此添加distinct或group by將不起作用。

這不是左連接造成的問題,內連接會有同樣的問題。問題是你在表格之間有一對多的關係,因此當你加入它們時有多條記錄。如果您只希望第一個表中的每個ID有一條記錄,那麼您必須指定您想要的其他表中的哪個記錄或個別數據字段 - 要麼使用聚合函數來獲取要匹配的記錄,要麼在其中執行某種過濾加入以確保您擁有一對一的關係。在不知道您的數據和業務規則的情況下,我無法建議最佳做法。

+0

我實際上並沒有在第一個表中每個ID有一個記錄,而是來自setTbl表的每個ID有一個記錄。 – theBo 2012-08-01 17:25:55

+0

是的,這就是你必須在你的代碼中做的事情,指定你想要的幾個記錄。 – HLGEM 2012-08-01 17:32:26

+0

有沒有簡單的解決方案,你需要做盡職調查,找出業務規則,讓您最終只有一個記錄。這在互聯網上無法解答。 – HLGEM 2012-08-01 17:33:44