0

我有3张桌子,

  • SystemUsers
  • OrganisationalUnits
  • UserOrganisationUnits- 使用 UserId/OrganisationUnitId 外键进行透视

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

我想要一个列表,列出所有UserOrganisationUnitsOrganisationalUnitCoveredTill”< 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')

我随机将日期设置为上述日期,因为我在所有 OrganisationalUnits“CoveredTill”列上手动将涵盖的截止日期设置为“2015-03-31 00:00:00.000”。

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

我已经有了电子邮件代码,所以这只是我遇到问题的查询。

编辑:-

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

编辑2: -

在解决了 sarin 的问题并准备向他提供 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')
4

1 回答 1

1

在进行内部联接之前执行右/左联接可能会给您带来意想不到的结果,因为它可能会产生空值,然后您的内部联接将尝试将它们过滤掉。我对表之间的关系并不完全清楚,但是您能否将它们全部转换为 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
于 2014-04-22T08:50:33.353 回答