SQL连接是否有条件?

时间:2017-05-15 13:51:34

标签: sql-server sql-server-2008 join

我有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:

Sample

这显示结果为108行。但我想要展示的只是前96行。

更新3

我对Sample略有更新。这确实得到了我想要的结果。我可以将NULL设置为@Manager,它将提取所有108条记录,或者我可以在其中拥有正确的管理员名称,并且它只会提取与Supervisor和Manager匹配的名称。

但是,我使用NULL执行此操作,我希望避免这样做,因为它会将插入的代码复制到Worker表中。

1 个答案:

答案 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,则此查询的工作方式完全相同。