多个内连接和左连接在同一个查询sql server 2012中

时间:2015-08-31 11:09:18

标签: sql-server join sql-server-2012

我有3个名为Message,File和Document的表。

消息列 - Pid,MessageId,MName,MContent
文件列 - FileId,MessageId,尺寸,类型
Documen t列 - FileId,DocumentPath,DocumentName

情景:

单条消息可以有多个文件,也可以没有文件。我需要选择 Mname,Mcontent,FileId,DocumentName并以表格格式显示给UI。

select 
       M.Mname as Name,Mcontent,D.FileId,D.DocumentName  
       FROM Message M 
       inner Join File F
       ON F.MessageID=M.MessageID
       inner join document D
       ON D.fileId=f.fileId     
       WHERE M.PID='6AE3B832'

但是没有得到预期的结果。 Pid将始终包含多个messageID。

任何人都可以建议实现这一结果。

预期结果如下,

<table border="1">
  <th>Mname</th>
  <th>Mcontent</th>
  <th>Fileid</th>
  <th>Documentname</th>
  <tr>
  <td>1st message</td>
    <td>1st mesage content</td>
    <td>001</td>
    <td>message.pdf</td>    
  </tr>
  <tr>
  <td>1st message</td>
    <td>1st mesage content</td>
    <td>002</td>
    <td>userManual.doc</td>    
  </tr>
   <tr>
  <td>2nd message</td>
    <td>2nd mesage content</td>
    <td>null</td>
    <td>null</td>    
  </tr>
  <tr>
  <td>3rd message</td>
    <td>3rd mesage content</td>
    <td>003</td>
    <td>policy.xlsx</td>    
  </tr>
  </table>

1 个答案:

答案 0 :(得分:1)

select 
   M.Mname as Name,Mcontent,D.FileId,D.DocumentName  
FROM Message M 
   LEFT JOIN File F
     ON F.MessageID=M.MessageID
   LEFT JOIN document D
     ON D.fileId=f.fileId     
WHERE M.PID='6AE3B832'

如果使用内部联接,则两个表必须具有匹配的记录。左连接只需要表Message有记录。