2014-04-17 23 views
0

之间我有3个表的数据透视表,SQL查询所有systemusers谁是organisationunits有DATEVALUE <...在

  • SystemUsers
  • OrganisationalUnits
  • UserOrganisationUnits - 透视与用户名/ OrganisationUnitId外键

所有表格都有一个Active位列,而OrganisationalUnit表有一个CoveredTilldatetime专栏。

我希望所有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') 

我随机设定的时间作为上述自我手动设置覆盖直到日期为“2015年3月31日00:00:00.000”上的所有OrganisationalUnits“CoveredTill”列。

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

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

编辑: -

我第一次走近这是需要3次独立的查询,我更多的测试之后想我得重新审视,除非有人能发现我在做什么毛病上面的查询?

编辑2: -

通过问题的工作沙林和准备给他提供一个SQL数据库/查询副本我发现一些联接正朝错误的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

执行权\留给你做一个内部联接可以给你意想不到的结果,因为它可能会产生零点之前加入和你的内部连接,然后会尝试以过滤掉。我不完全清楚表格之间的关系,但是你可以将它们全部变成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 
+0

是的,这是查询我开始使用并获得独特用户的相同结果集,而不是重复。我期望从“UserOrganisationUnits”表中获取所有记录,这些记录是活动的,并且具有与“日期条件”一起的“SystemUsers”/“OrganisationUnits”的活动匹配,尽管现在这些并不重要,因为所用日期不会排除任何记录马上。 – Myzifer

+0

我在其他方面只是试图使用3个人的查询,并尝试将它们结合起来,以获得与使用edmx的MVC项目相同的结果。 (我已经有更多的经验做这方面的查询,而不是直接在SQL中。 – Myzifer

+0

我已经改变了连接的顺序来匹配您的评论,并且还将where条件移入连接以加快速度。如果这不是给你想要的东西,我想你需要给出问题中每个表的一些数据示例,然后给出一个预期的结果集示例。 – sarin