0

How do i select a Distinct value from a select statement with LEFT JOINS? The value I'm after is one of either s_id from trainingTbl or setName from setsTbl.

The full string is provided below.

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

独自性のためにGROUPBYを試してください

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

そもそも問題は、select * (SQL アンチパターンであり、本番コードには決して現れてはならないもの) を使用しているため、各レコードが一意であるため、distinct または group by を追加しても機能しないことです。

問題を引き起こしているのは左結合ではなく、内部結合でも同じ問題が発生します。問題は、テーブル間に 1 対多の関係があるため、それらを結合すると複数のレコードが存在することです。最初のテーブルで ID ごとに 1 つのレコードのみが必要な場合は、他のテーブルで必要なレコードまたは個々のデータ フィールドを指定する必要があります。集計関数を使用して一致させたいレコードを取得するか、 1対1の関係を築くために参加してください。データとビジネス ルールを知らなければ、最善の方法を提案することはできません。

于 2012-08-01T15:52:11.983 に答える