Sql 如果使用Join未找到匹配项,如何从表1中获取所有记录并从表2中获取匹配记录
我有一个问题Sql 如果使用Join未找到匹配项,如何从表1中获取所有记录并从表2中获取匹配记录,sql,sql-server-2008,join,left-join,Sql,Sql Server 2008,Join,Left Join,我有一个问题 declare @NOCAppId int = 1 Select doc.DocId, doc.DocName,subDoc.NOCAppId, subDoc.SDocId, subDoc.Status FROM NOCDocument doc join NOCSubmittedDoc subDoc on doc.DocId = subDoc.DocId WHERE subDoc.NOCAppId = @NOCAppId OR @NOCAppId IS NULL 这是我
declare @NOCAppId int = 1
Select doc.DocId, doc.DocName,subDoc.NOCAppId,
subDoc.SDocId, subDoc.Status
FROM NOCDocument doc
join NOCSubmittedDoc subDoc
on doc.DocId = subDoc.DocId
WHERE subDoc.NOCAppId = @NOCAppId
OR @NOCAppId IS NULL
这是我的第一张桌子
这是我的第二张桌子
现在,如果我将DocId发送为Null,我希望结果如下所示,如果我在表2中有DocId的记录
SDocId Status DocId NOCAppId DocName
1 NotSubmitted 1 1 T1
2 Submitted 2 1 T2
3 NotSubmitted 3 1 T3
4 NotRequired 4 1 T4
5 Submitted 5 1 T5
如果表2中没有匹配的行w.r.t NOCAppId,那么我希望结果如下
SDocId Status DocId NOCAppId DocName
NULL NotSubmitted 1 NULL T1
NULL Submitted 2 NULL T2
NULL NotSubmitted 3 NULL T3
NULL NotRequired 4 NULL T4
NULL Submitted 5 NULL T5
谢谢
在第二个表示例数据中,我没有看到任何
NOCAppId
为null
。如果有,请将其添加到示例数据中。是否使用内部的外部联接(左、右完全外部联接)?不要使用加入nocsmitteddoc子文档
使用左加入nocsmitteddoc子文档
?@Utsav这就是它的样子。@xQbert thxs获取建议。已尝试但无效。它会将where子句移动到联接中,并将where subDoc.nocapid=@NOCAppId或@NOCAppId为NULL
更改为,并且subDoc.nocapid=@NOCAppId或@NOCAppId为NULL
,因为where cluase正在对左联接求反,使左联接成为内部联接。
SDocId Status DocId NOCAppId DocName
1 NotSubmitted 1 1 T1
2 Submitted 2 1 T2
3 NotSubmitted 3 1 T3
4 NotRequired 4 1 T4
5 Submitted 5 1 T5
SDocId Status DocId NOCAppId DocName
NULL NotSubmitted 1 NULL T1
NULL Submitted 2 NULL T2
NULL NotSubmitted 3 NULL T3
NULL NotRequired 4 NULL T4
NULL Submitted 5 NULL T5
SELECT case when @NoCAppID is null then NULL else SDocID end as SDocID
, Status
, DocID
, case when @NoCAppID is null then NULL else NoCAppID end as NocAppID
, DocName
FROM NOCDocument doc
on Sub1.DocID = Doc.DocID
LEFT JOIN NOCSubmittedDoc subDoc
on doc.DocId = subDoc.DocId
and (subDoc.NoCAppId = coalesce(@NoCAppId,1))
--It appears to me you want the status when nocAppID is 1 even if null is passed in, but
--you want Null values to appear in NoCAppID, and SDocID in the select,
--which is handled by a case statement So coalesce here and case in the select!