我有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')
我随机将日期设置为上述日期,因为我在所有 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')