0

如何从带有 LEFT JOINS 的选择语句中选择不同的值?我追求的值是来自 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 "
4

3 回答 3

0

try this

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 

or this (not sure what exactly you need)

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
于 2012-08-01T15:01:44.747 回答
0

首先,您的问题是您使用的是 select * (一种 SQL 反模式,并且不应出现在生产代码中),因此每条记录都是唯一的,因此添加 distinct 或 group by 将不起作用。

导致问题的不是左连接,内连接也会有同样的问题。问题是表之间存在一对多的关系,因此在加入它们时会有多条记录。如果您只希望第一个表中的每个 id 有一条记录,那么您必须指定您想要的其他表中的哪个记录或单个数据字段 - 使用聚合函数来获取您想要匹配的记录,或者在加入以确保您拥有一对一的关系。在不了解您的数据和业务规则的情况下,我无法建议最好的做法。

于 2012-08-01T15:52:11.983 回答
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 
于 2012-08-01T14:58:07.557 回答