如何从带有LEFT JOINS的select语句中选择Distinct值? 我之后的值是trainingTbl中的s_id或setsTbl中的setName之一。
下面提供了完整的字符串。
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 :(得分: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 :(得分: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
答案 2 :(得分:0)
首先,你的问题是你正在使用select *(一个SQL反模式和一些不应该出现在生产代码中的东西),因此每条记录都是唯一的,所以添加distinct或group by是行不通的。
导致问题的不是左连接,内连接会有同样的问题。问题是表之间存在一对多关系,因此在加入表时会有多条记录。如果你只想在第一个表中每个id有一个记录,那么你必须在你想要的其他表中指定哪个记录或单个数据字段 - 要么使用聚合函数来获取你想要匹配的记录,要么在加入以确保您有一对一的关系。在不知道您的数据和业务规则的情况下,我无法建议最好的做法。