带有WHERE子句的Sql LEFT OUTER JOIN

Eya*_*yal 6 sql-server

我有两张桌子:

请求:

 RequestID | Msg
----------------
    5  | abc
    6  | def
    7  | ghi
    8  | jkl
Run Code Online (Sandbox Code Playgroud)

RequestStatus:

RequestStatusID | RequestID |StatusID
-------------------------------------
        1             5         1
        2             8         2
Run Code Online (Sandbox Code Playgroud)
  • 并非每个请求都有记录 RequestStatus

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

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

And*_*rew 17

将约束移动到on子句.

select *
from request r
left join requestStatus rs
on r.requestID = rs.requestID
--and status_id = 1
and status_id <> 2
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我认为OP想要除了statusID = 2之外的所有行,而不仅仅是1 (2认同)