与具有左连接的select语句不同

时间:2012-08-01 14:54:27

标签: sql database

如何从带有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 "

3 个答案:

答案 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有一个记录,那么你必须在你想要的其他表中指定哪个记录或单个数据字段 - 要么使用聚合函数来获取你想要匹配的记录,要么在加入以确保您有一对一的关系。在不知道您的数据和业务规则的情况下,我无法建议最好的做法。