加入4个表中允许空值的所有项目

时间:2013-07-26 13:28:24

标签: sql join null group-by

我正在制作一个培训计划,而我正处于无法弄清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个选择陈述

  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

  3. 我难倒了什么建议?

1 个答案:

答案 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

你的第二个陈述可能会有类似的调整。