0

我正在制定一个培训计划,但我无法弄清楚 SQL 查询。我有 4 个表:userProfilesTbl、trainingTbl、userAssessmentTbl 和 setsTbl userProfilesTbl 和 userAssessmentsTbl 通过作为唯一身份字段类型的 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除了LEFT/之外,许多系统都支持RIGHT 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

您的第二个陈述可能可以类似地调整。

于 2013-07-26T13:35:26.797 回答