SQL联接未根据条件引入排他行
我正在尝试在两个表之间应用左联接 这是第一张表: 这是第二张表: 两者都由WorkTypeId列连接 现在的要求是,如果表2中有一个基于某个userid的条目,那么我应该从表2中获取该userid的所有worktypeid,其余的worktypeid应该来自表1,其余的列为0或1 以下是我正在尝试应用的查询:SQL联接未根据条件引入排他行,sql,sql-server,left-join,Sql,Sql Server,Left Join,我正在尝试在两个表之间应用左联接 这是第一张表: 这是第二张表: 两者都由WorkTypeId列连接 现在的要求是,如果表2中有一个基于某个userid的条目,那么我应该从表2中获取该userid的所有worktypeid,其余的worktypeid应该来自表1,其余的列为0或1 以下是我正在尝试应用的查询: IF EXISTS (SELECT TOP 1 userid FROM Table2 WHERE UserId = @UserId) BEGIN Print 'insid
IF EXISTS (SELECT TOP 1 userid FROM Table2 WHERE UserId = @UserId)
BEGIN
Print 'inside If'
Select L.WorkType as WorkTypeName, UW.WorkTypeId,UW.IsChecked,UW.Active,UW.Priority
From Table1 L
Inner Join Table2 UW
On L.WorkTypeId = 1 --UW.WorkTypeId
Where UserId =99 ---@userId
And L.Active = 1
--Order By WorkTypeName ASC
UNION
SELECT L.WorkType as WorkTypeName,UW.WorkTypeId,0 as IsChecked,1 as Active,0 as Priority
From Table1 L
Left Join Table2 UW
On L.WorkTypeId =1 --UW.WorkTypeId
Where UserId =99 -- @userId
And L.Active = 1
AND UW.Priority IS NULL
END
但我仍然看到只有一行是匹配的行,而不是左表中的其他行以及硬编码的值
编辑1:
我已将查询更改为以下内容
Select L.WorkType as WorkTypeName, L.WorkTypeId,UW.IsChecked,UW.Active,UW.Priority
From Table1 L
Inner Join Table2 UW
On L.WorkTypeId = UW.WorkTypeId
Where UserId =99 ---@userId
And L.Active = 1
--Order By WorkTypeName ASC
UNION
SELECT L.WorkType as WorkTypeName,L.WorkTypeId,0 as IsChecked,1 as Active,0 as Priority
From Table1 L
Left Join Table2 UW
On UW.WorkTypeId = L.WorkTypeId
AND L.WorkTypeId Not In (Select WorkTypeId From UserWorkType Where UserId =99) --@UserId)
AND L.Active = 1
但是仍然从两个表中获取行
我不需要那个标有红色的,因为这已经出现在表2中了。
我认为使用左外连接应该能够得到结果。 请尝试以下查询:
Select tab2.WorkType as WorkTypeName, tab2.WorkTypeId,tab2.IsChecked,tab2.Active
From Table2 tab2
left Join Table1 tab1 On tab2.WorkTypeId = tab1.WorkTypeId
Where UserId = @userId
And tab2.Active = 1
这应该通过将过滤条件移动到
on
子句来实现:
select L.WorkType as WorkTypeName, UW.WorkTypeId, UW.IsChecked, UW.Active, UW.Priority
from Table1 L left join
Table2 UW
on L.WorkTypeId = UW.WorkTypeId and
UW.UserId = 99 ---@userId
where L.Active = 1
使用内部联接时,On子句和Where子句之间没有区别。两种方法得到的结果相同。 但是使用左连接,您确实可以在SQL Server中获得On和Where之间的差异。尝试更改要打开的位置:
Select L.WorkType as WorkTypeName, L.WorkTypeId,UW.IsChecked,UW.Active,UW.Priority
From Table1 L
Inner Join Table2 UW
On L.WorkTypeId = UW.WorkTypeId
Where UserId =99 ---@userId
And L.Active = 1
--Order By WorkTypeName ASC
UNION
SELECT L.WorkType as WorkTypeName,L.WorkTypeId,0 as IsChecked,1 as Active,0 as Priority
From Table1 L
Left Join Table2 UW
On UW.WorkTypeId = L.WorkTypeId
AND L.WorkTypeId Not In (Select WorkTypeId From UserWorkType Where UserId =99) --@UserId)
AND L.Active = 1
AND UW.WorkTypeId is null
详细要求请参考我的问题。 谢谢你的回答。 根据以下要求,是我最终创建的查询 愚蠢的是我不需要使用另一个表(表2),因为我只需要独占记录 我正在使用一个不在。 我保留了注释的代码,以保持可理解性
Select L.WorkType as WorkTypeName, L.WorkTypeId,UW.IsChecked,UW.Active,UW.Priority
From LuWorktypes L
Inner Join UserWorkType UW
On L.WorkTypeId = UW.WorkTypeId
AND UserId =@userId ---@userId
And L.Active = 1
--Order By WorkTypeName ASC
UNION
SELECT L.WorkType as WorkTypeName,L.WorkTypeId,0 as IsChecked,1 as Active,0 as Priority
From LuWorktypes L
-- Left Join UserWorkType UW
-- On UW.WorkTypeId = L.WorkTypeId
Where L.WorkTypeId Not In (Select WorkTypeId From UserWorkType Where UserId = @UserId)
AND L.Active = 1
谢谢但是Tab2没有将WorkType作为列,即使我用tab1替换它,我仍然没有得到期望的结果。当您在内部表上放置筛选器时,实际上是将其作为内部联接。因此,在连接之前,可以使用某种派生表或cte将结果过滤到特定的userid,或者将该条件移动到连接本身中。
其中userid=99
。您几乎可以过滤掉UserIdNULL
的记录。非常感谢。虽然不是直接的,但这是一个很好的链接顺便说一句,我已经找到了答案,请阅读我自己的答案在这里。我不知道是谁否决了我的问题,因为我一直在陈述我努力的每一步。我刚刚编辑了我的问题。请看一看。然后在第二个查询中,您可以添加以下内容,例如:和UW.WorkTypeId为null。如果更改了查询,请尝试。您是否错过了UW.UserId之前的“Where”?因为查询不完整。@Rishabh。没有。它缺少和。