0

私はトレーニング プログラムに取り組んでいますが、SQL クエリを理解できないところまで来ています。userProfilesTbl、trainingTbl、userAssessmentTbl、setsTbl userProfilesTbl と userAssessmentsTbl は、一意の ID フィールド タイプである UserId fkey を介して関連付けられています。

trainingTbl と userAssessmentTbl は、tt_id fkey INT フィールド タイプによって関連付けられます。setsTbl と trainingTbl は、s_id fkey INT フィールド タイプによって関連付けられます。

trainingTbl には、指定されたユーザー グループによって指定された日付に実行されたトレーニングが入力されます。

userAssessmentTbl は、個々のユーザーのトレーニング (結果、メモなど) によって入力されます。

userProfilesTbl は、メンバーシップとロールのフレームワーク (aspnet_users テーブルに接続) に含まれていないすべての追加ユーザー情報を保持します。

setsTbl には、さまざまなタイプのトレーニングのリストが入力されます。

トレーニングを行ったかどうかに関係なく、すべてのトレーニング セットとユーザーを表示したいと考えています。

Gridview (PIVOT テーブル) は、userProfilesTbl から surName、setsTbl から setName、userAssessmentTbl から結果 (値) を返す必要があります。
現在、2つの選択ステートメントがあります

  1. トレーニング結果なしで setName と surname を表示します

    Dim query As String = "SELECT * FROM userProfilesTbl LEFT OUTER JOIN userAssessmentTbl ON userProfilesTbl.UserId = userAssessmentTbl.UserId LEFT OUTER JOIN trainingTbl ON userAssessmentTbl.tt_id = trainingTbl.tt_id LEFT OUTER JOIN setsTbl ON trainingTbl.s_id = setsTbl.s_id WHERE userProfilesTbl.st_id=@st_id AND userProfilesTbl.wa_id=@wa_id AND DATEPART(mm,t_date) = @m_date AND DATEPART(yyyy,t_date) = @y_date ORDER BY surname ASC

  2. は、トレーニングを行ったユーザーのトレーニング結果 setName、姓のみ、および彼らが実施したトレーニングのみを示します。他のすべてのユーザーとトレーニングは表示されません。

    SELECT * FROM userProfilesTbl, setsTbl, userAssessmentTbl, trainingTbl WHERE (userProfilesTbl.UserId = userAssessmentTbl.UserId) AND (userAssessmentTbl.tt_id = trainingTbl.tt_id) AND userProfilesTbl.st_id=@st_id AND userProfilesTbl.wa_id=@wa_id AND DATEPART(mm,t_date) = @m_date AND DATEPART(yyyy,t_date) = @y_date ORDER BY surname ASC

何か提案がありませんか?

4

1 に答える 1

0

どのデータベースシステムを使用していますか? /FULL OUTER JOINに加えて、多くのシステムがサポートしています。これにより、反対側にパートナーがいない両側からのレコードが返されます。LEFTRIGHT OUTER JOIN

編集:

SELECT * 
  FROM userProfilesTbl
  FULL OUTER JOIN userAssessmentTbl ON userProfilesTbl.UserId = userAssessmentTbl.UserId
  FULL OUTER JOIN trainingTbl ON userAssessmentTbl.tt_id = trainingTbl.tt_id
  FULL OUTER JOIN setsTbl ON trainingTbl.s_id = setsTbl.s_id
 ORDER BY surname ASC

テーブルに含まれるすべてのデータが表示されます。を使用してデータを制限WHEREすると、WHERE 条件に使用する列の値が空の行も除外されます。

したがって、次のようなものを使用する必要があります

SELECT * 
  FROM userProfilesTbl
  FULL OUTER JOIN userAssessmentTbl ON userProfilesTbl.UserId = userAssessmentTbl.UserId
  FULL OUTER JOIN trainingTbl ON userAssessmentTbl.tt_id = trainingTbl.tt_id
  FULL OUTER JOIN setsTbl ON trainingTbl.s_id = setsTbl.s_id
 WHERE (userProfilesTbl.st_id=@st_id OR userProfilesTbl.st_id IS NULL)
   AND (userProfilesTbl.wa_id=@wa_id OR userProfilesTbl.wa_id IS NULL)
   AND ((DATEPART(mm,t_date) = @m_date AND DATEPART(yyyy,t_date) = @y_date) OR t_date IS NULL)
 ORDER BY surname ASC

2 番目のステートメントは、おそらく同様に適用できます。

于 2013-07-26T13:35:26.797 に答える