Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果使用Join未找到匹配项,如何从表1中获取所有记录并从表2中获取匹配记录_Sql_Sql Server 2008_Join_Left Join - Fatal编程技术网

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
谢谢

  • 让它成为一个左连接
  • 将where子句移动到联接,因为它将否定外部联接(使其成为内部联接,因为左联接生成的所有空值都将被排除)
  • 消除空检查,根据您的数据不需要它
  • 添加case语句以处理null和联合时合并。看起来,即使它为“Null”,您也希望返回这些记录的状态NocAppId=1。。。。如果不是这样,那么解释一下当NoCAppID为null时如何选择“status”

  • 在第二个表示例数据中,我没有看到任何
    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!