【问题标题】:How to get all the records from Table1 and matching ones from Table2 in case no match found using Join如果使用 Join 找不到匹配项,如何从 Table1 中获取所有记录并从 Table2 中获取匹配记录
【发布时间】:2016-08-27 07:32:24
【问题描述】:

我有一个问题

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  DocName
1      T1
2      T2
3      T3
4      T4
5      T5

这是我的第二张桌子

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
6       NotRequired     1     2          T1
7       NotRequired     2     2          T3
8       NotRequired     3     2          T3
9       NotRequired     4     2          T4
10      NotRequired     5     2          T5

现在,如果我将 DocId 作为 Null 发送,如果我在 Table2 中有 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

如果 table2 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

谢谢

【问题讨论】:

  • 在您的第二个表示例数据中,我没有看到任何NOCAppIdnull。如果存在,请将其添加到示例数据中。
  • 使用外连接代替内连接(左、右全外)?而不是join NOCSubmittedDoc subDoc 使用LEFT JOIN NOCSubmittedDoc subDoc ?
  • @Utsav 这就是它的样子。
  • @xQbert 感谢您的建议。已经试过了,还是不行。
  • 它会将 where 子句移动到连接中,并将 WHERE subDoc.NOCAppId = @NOCAppId OR @NOCAppId IS NULL 更改为 and subDoc.NOCAppId = @NOCAppId OR @NOCAppId IS NULL,因为左连接被 where 子句否定,从而使左连接成为内部连接。

标签: sql sql-server-2008 join left-join


【解决方案1】:
  1. 使其成为左连接
  2. 将 where 子句移至连接,因为它否定外连接(使其成为内连接,因为左连接生成的所有 NULL 值都将被排除)
  3. 消除空检查,根据您的数据不需要它。
  4. 添加 case 语句来处理 null 和连接时的合并。看起来即使是“Null”,您也希望返回这些记录的状态 NocAppId = 1....

.

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!

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多