对于organisationunits的所有系统用户的SQL查询具有日期值< ...中间有数据透视表

时间:2014-04-17 15:07:23

标签: sql sql-server clrstoredprocedure

我有3张桌子,

  • SystemUsers
  • OrganisationalUnits
  • UserOrganisationUnits - 使用UserId / OrganisationUnitId外键进行转轴

所有表格都有Active位列,OrganisationalUnit表格有CoveredTill datetime列。

我想要一个所有UserOrganisationUnits的列表,其中OrganisationalUnit" CoveredTill"是< x(值与在clr中设置的值无关)日期和所有表记录都是活动的。

到目前为止,我只是设法从我的查询中获得了独特的用户,因此我们非常感谢任何建议。

SELECT     
   SystemUsers.DisplayName, SystemUsers.Email, 
   OrganisationalUnits.Description, OrganisationalUnits.CoveredTill, 
   OrganisationalUnits.Id, OrganisationalUnits.ParentId, OrganisationalUnits.TypeId
FROM         
   SystemUsers 
RIGHT OUTER JOIN
   OrganisationalUnits ON SystemUsers.Id = OrganisationalUnits.Id 
INNER JOIN
   UserOrganisationUnits ON SystemUsers.Id = UserOrganisationUnits.Id
WHERE     
   (OrganisationalUnits.Active = 1) 
   AND (SystemUsers.Active = 1) 
   AND (UserOrganisationUnits.Active = 1) 
   AND (OrganisationalUnits.CoveredTill < '2017-03-31 00:00:00.000')

我随机将日期设置为上述,因为我手动将覆盖日期设置为&#34; 2015-03-31 00:00:00.000&#34;在所有OrganisationalUnits&#34; CoveredTill&#34;列。

我的目标是拥有一个单独的SQL查询字符串,我可以在我的clr存储过程中使用该字符串来创建需要通过电子邮件发送的所有用户的列表,因为组织单元不再被覆盖,并且所述电子邮件包含哪个组织因此,为什么只有一个独特的用户列表是不够的。

我已经拥有电子邮件代码,因此它只是我遇到问题的查询。

编辑: -

我第一次接近这个需要3个单独的查询,我想经过一些测试之后我会不得不重新访问,除非有人能够发现我在上述查询中做错了什么?

编辑2: -

在解决沙林的问题并准备向他提供sql db / query副本后,我发现一些连接指向错误的ID字段(从不同的窗格自动创建,因此始终警惕他们创建的任何内容)所以下面我已经包含了最终的解决方案。 (其中包括我认为可能有用的几个额外字段。)

SELECT  OrganisationalUnits.Description, OrganisationalUnits.CoveredTill, SystemUsers.DisplayName, SystemUsers.Email, 
        UserOrganisationUnits.LastVisited AS UOULastVisited, SystemUsers.LastVisited AS SULastVisited
FROM    UserOrganisationUnits INNER JOIN
        OrganisationalUnits ON UserOrganisationUnits.OrganisationUnitId = OrganisationalUnits.Id INNER JOIN
        SystemUsers ON UserOrganisationUnits.UserId = SystemUsers.Id
WHERE   (OrganisationalUnits.Active = 1) AND (SystemUsers.Active = 1) AND (UserOrganisationUnits.Active = 1) AND 
        (OrganisationalUnits.CoveredTill < '2017-03-31 00:00:00.000')

1 个答案:

答案 0 :(得分:1)

在执行内部联接之前执行Right \ left联接可能会产生意外结果,因为它可能会产生空值,然后内部联接将尝试将它们过滤掉。我不完全清楚表格之间的关系,但是你可以将它们全部转化为INNER JOINS以获得相同的列表并根据预期结果产生类似的结果吗?

“我的目标是......创建一个需要通过电子邮件发送的所有用户的列表,因为组织单位不再被覆盖”

更新:

SELECT     
   SystemUsers.DisplayName, SystemUsers.Email, 
   OrganisationalUnits.Description, OrganisationalUnits.CoveredTill, 
   OrganisationalUnits.Id, OrganisationalUnits.ParentId, OrganisationalUnits.TypeId
FROM         
   UserOrganisationUnits
INNER JOIN SystemUsers ON SystemUsers.Id = UserOrganisationUnits.Id
                       AND (SystemUsers.Active = 1) 

INNER JOIN OrganisationalUnits ON OrganisationalUnits.Id = SystemUsers.Id
                               AND OrganisationalUnits.Active = 1
                               AND OrganisationalUnits.CoveredTill < '2017-03-31 00:00:00.000'

WHERE UserOrganisationUnits.Active = 1