我有两张桌子:
请求:
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)
时,它当然不起作用。
答案 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
答案 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)
这个答案假设您只需要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"
}