我正在制作一个培训计划,而我正处于无法弄清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,从setsAssessmentTbl返回setsTbl和result(value)中的setName。 目前我有2个选择陈述
显示没有任何培训结果的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
显示培训结果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
我难倒了什么建议?
答案 0 :(得分: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
你的第二个陈述可能会有类似的调整。