3

次のクエリに問題があるようです。mc_WorkoutDetails基本的には動作しますが、 2 回から 1 行を返す場合があります。

元のクエリは次のとおりです。

ALTER PROCEDURE [dbo].[mc_Workouts_GetActivities]
    @WorkoutID                  bigint
AS
BEGIN
    SET NOCOUNT ON

    SELECT d.ID, a.Description,
            CASE WHEN Reps = 0 THEN NULL ELSE Reps END AS Reps,
            CASE WHEN Sets = 0 THEN NULL ELSE Sets END AS Sets,
            CASE WHEN Minutes = 0 THEN NULL ELSE Minutes END AS Minutes,
            d.Comments, c.Name AS Category, a.CategoryID,
            (CASE WHEN v.ActivityID IS NULL THEN 0 ELSE 1 END) AS HasVideo,
            a.ID AS ActivityID
    FROM mc_WorkoutDetails d
            INNER JOIN mc_Activities a ON d.ActivityID = a.ID
            INNER JOIN mc_Activities_Categories c ON a.CategoryID = c.ID
            LEFT OUTER JOIN mc_TrainerVideos v ON a.ID = v.ActivityID
    WHERE (d.WorkoutID = @WorkoutID)
    ORDER BY SortOrder, a.Description

    RETURN @@ERROR
END

次に、変更してみました:

INNER JOIN mc_Activities a ON d.ActivityID = a.ID
INNER JOIN mc_Activities_Categories c ON a.CategoryID = c.ID

に:

LEFT OUTER JOIN mc_Activities a ON d.ActivityID = a.ID
LEFT OUTER JOIN mc_Activities_Categories c ON a.CategoryID = c.ID

しかし、それは役に立たなかったようです。私はまだ重複した行を取得します。

誰が何が起こっているかを見ることができますか?

4

2 に答える 2

2

できることは、グループを使用して同じテーブルに結合を追加し、重複する行を取り除くことです。

したがって、これをFROMmc_WorkoutDetailsdの後に結合に追加します。

inner join (select [columns you want to select], max(id) id
            from mc_WorkoutDetails
            group by [columns you want to select] ) q on q.id = d.id

それが理にかなっているかどうか教えてください。基本的に、個別に最大IDを取得しているため、結合の行の1つを削除します。重複したい場合でも、そこにあると想定されていても削除されることを覚えておく必要があります。

完全な変更は次のようになります。

ALTER PROCEDURE [dbo].[mc_Workouts_GetActivities]
@WorkoutID                  bigint
AS
BEGIN
SET NOCOUNT ON

SELECT d.ID, a.Description,
        CASE WHEN Reps = 0 THEN NULL ELSE Reps END AS Reps,
        CASE WHEN Sets = 0 THEN NULL ELSE Sets END AS Sets,
        CASE WHEN Minutes = 0 THEN NULL ELSE Minutes END AS Minutes,
        d.Comments, c.Name AS Category, a.CategoryID,
        (CASE WHEN v.ActivityID IS NULL THEN 0 ELSE 1 END) AS HasVideo,
        a.ID AS ActivityID
FROM mc_WorkoutDetails d
inner join (select Reps, Sets, Comments, Minutes, max(id) id
            from mc_WorkoutDetails
            group by Reps, Sets, Comments, Minutes ) q on q.id = d.id
        INNER JOIN mc_Activities a ON d.ActivityID = a.ID
        INNER JOIN mc_Activities_Categories c ON a.CategoryID = c.ID
        LEFT OUTER JOIN mc_TrainerVideos v ON a.ID = v.ActivityID
WHERE (d.WorkoutID = @WorkoutID)
ORDER BY SortOrder, a.Description

RETURN @@ERROR
END
于 2013-02-12T02:13:20.990 に答える