SQL联接未根据条件引入排他行

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

我正在尝试在两个表之间应用左联接

这是第一张表:

这是第二张表:

两者都由WorkTypeId列连接

现在的要求是,如果表2中有一个基于某个userid的条目,那么我应该从表2中获取该userid的所有worktypeid,其余的worktypeid应该来自表1,其余的列为0或1

以下是我正在尝试应用的查询:

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
。您几乎可以过滤掉UserId
NULL
的记录。非常感谢。虽然不是直接的,但这是一个很好的链接顺便说一句,我已经找到了答案,请阅读我自己的答案在这里。我不知道是谁否决了我的问题,因为我一直在陈述我努力的每一步。我刚刚编辑了我的问题。请看一看。然后在第二个查询中,您可以添加以下内容,例如:和UW.WorkTypeId为null。如果更改了查询,请尝试。您是否错过了UW.UserId之前的“Where”?因为查询不完整。@Rishabh。没有。它缺少