带有WHERE子句的Sql LEFT OUTER JOIN

时间:2014-12-22 17:03:51

标签: sql-server

我有两张桌子:

请求:

 RequestID | Msg
----------------
    5  | abc
    6  | def
    7  | ghi
    8  | jkl

RequestStatus:

RequestStatusID | RequestID |StatusID
-------------------------------------
        1             5         1
        2             8         2
  • 并非每个请求都有RequestStatus
  • 中的记录

Request时,我需要表StatusID = 2中的所有记录。 (requestID=8应该过滤掉)

我正在使用LEFT OUTER JOIN来接收表Request中的记录,但当我添加Where子句(Where StatusID = 1)时,它当然不起作用。

6 个答案:

答案 0 :(得分:14)

将约束移动到on子句。

select *
from request r
left join requestStatus rs
on r.requestID = rs.requestID
--and status_id = 1
and status_id <> 2

发生的事情是首先执行外连接。来自外部联接的任何没有匹配的行在所有列中都将为空。然后应用你的where子句,但是因为1&lt;&gt; null,它不会像你想要的那样工作。

编辑:根据Piyush的评论改变了条款。

答案 1 :(得分:2)

试试这个

SELECT *
FROM Request R
  LEFT JOIN RequestStatus RS ON R.RequestID  =  RS.RequestID   
  WHERE RS.StatusID <> 2 OR RS.RequestID IS NULL

SQL FIDDLE

答案 2 :(得分:1)

您需要像这样使用NOT IN查询语句

Select * 
From Request 
Where RequestID not in 
    (Select RequestID 
    From RequestStatus 
    Where StatusID = 2)

Select * 
From Request r 
left join requestStatus rs on r.requestID = rs.requestID 
Where r.RequestID not in 
    (Select RequestID 
    From RequestStatus 
    Where StatusID = 2)

答案 3 :(得分:0)

答案很简单,使用左连接但过滤StatusId不同于2的行,如下所示:

select *
from request r
left join requestStatus rs
on r.requestID = rs.requestID
where rs.StatusId <> 2 or rs.StatusId IS NULL

编辑:添加或rs.StatusId IS NULL附加条件还包括requestStatus表中不在请求表中匹配的行。

答案 4 :(得分:0)

SqlFiddle

这个答案假设您只需要RequestId&amp;请求表中的消息,其中RequestStatus表中没有记录,其中RequestId和StatusId为2。

使用此查询(vs左连接),您将无法获得具有多个RequestStatus记录的请求的额外记录。

Aaron Bertrand - Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?

中,使用 not exists 子句比本文中的Except,Not In,Outer Apply等更快
select r.RequestId, r.Msg
  from Request r
  where not exists (
    select 1 
    from RequestStatus rs 
    where rs.StatusId = 2
      and rs.RequestId = r.RequestId
    )

答案 5 :(得分:0)

在SQL Server 2017中,您可以通过这种方式将AND置于ON后

{
"fruit": "Orange",
"size": "Small",
"color": "Yellow"
}