我有3个表,我加入了2个变量,我在其中一个联接中使用了这些表。
我想要做的是根据任何一个陈述而不是两者都弄清楚如何加入。
这是当前的查询:
SELECT DISTINCT
WR.Id,
CAL.Id as 'CalendarId',
T.[First Of Month],
T.[Last of Month],
WR.Supervisor,
WR.cd_Manager as [Manager], --Added to search by the Manager--
WR.[Shift] as 'ShiftId'
INTO #Workers
FROM #T T
--Calendar
RIGHT JOIN [dbo].[Calendar] CAL
ON CAL.StartDate <= T.[Last of Month]
AND CAL.EndDate >= T.[First of Month]
--Workers
--This is the problem join
RIGHT JOIN [dbo].[Worker_Filtered]WR
ON WR.Supervisor IN (SELECT Id FROM [dbo].[User] WHERE FullName IN(@Supervisors))
or (WR.Supervisor IN (SELECT Id FROM [dbo].[User] WHERE FullName IN(@Supervisors))
AND WR.cd_Manager IN(SELECT Id FROM [dbo].[User] WHERE FullNameIN(@Manager))) --Added to search by the Manager--
AND WR.[Type] = '333E7907-EB80-4021-8CDB-5380F0EC89FF' --internal
WHERE CAL.Id = WR.Calendar
AND WR.[Shift] IS NOT NULL
我想要做的是要么根据与Worker_Filtered
匹配的@Supervisor
表格得到结果,要么(但不是两者都有)让它与@Supervisor
和{{1}相匹配}。
现在的方式如果它匹配任何一个条件,它将被返回。这应该将返回的结果限制为同时拥有Supervisor和Manager的Worker,它们的数据集小于仅与Supervisor匹配的数据集。
更新
我上面的查询是为主管工人提取数据的更大整体的一部分。
我还希望将其限制在特定主管下的经理。
例如,如果@Manager
和@Supervisor = John Doe
以及@Manager = Jane Doe
有9位工作人员,其中8位在John
的管理层下,那么我希望最终结果表明每个月只有8名工人。使用当前查询,它仍然显示每个月的所有9。
如果我将部分Jane
更改为:
RIGHT JOIN
然后它只返回12行WR.Supervisor IN (SELECT Id FROM [dbo].[User] WHERE FullName IN (@Supervisors))
AND WR.cd_Manager IN(SELECT Id FROM [dbo].[User] WHERE FullName IN(@Manager))
。
更新2
很抱歉,这需要很长时间才能获得样品。我无法让SQL Fiddle为SQL Server 2008/2014工作,所以我使用的是rextester:
这显示结果为108行。但我想要展示的只是前96行。
更新3
我对Sample略有更新。这确实得到了我想要的结果。我可以将NULL
设置为@Manager
,它将提取所有108条记录,或者我可以在其中拥有正确的管理员名称,并且它只会提取与Supervisor和Manager匹配的名称。
但是,我使用NULL
执行此操作,我希望避免这样做,因为它会将插入的代码复制到Worker表中。
答案 0 :(得分:1)
更新3中对预期结果的描述现在已经很清楚了,谢谢。你的问题&#39;加入需要:
RIGHT JOIN Worker_Filtered wr on (wr.Supervisor in(@Supervisors)
and case when @Manager is null then 1
else case when wr.Manager in(@Manager) then 1 else 0 end
end = 1)
顺便说一下,我不知道你期望in(@Supervisors)
能达到什么目标,但是如果你希望以逗号分隔的主管列表作为单个字符串提供并且{ {1}}匹配他们中的任何一个然后你会感到失望。如果您改为使用wr.Supervisor
,则此查询的工作方式完全相同。