需要使用连接的SQL查询

时间:2014-06-30 15:20:15

标签: sql join

我有四张桌子。

DocumentList

DocumentID  int 
DocumentDescription varchar(100)    
DocumentName    varchar(100)    
DocumentTypeCode    int 
Archive ud_DefaultBitFalse:bit

DocumentStepLevel

DocumentStepID  int
DocumentID  int
StepLevelCode   int

DocumentAttachment

DocumentAttachmentGenID int
DocumentStepID  int 
AttachmentGenID int 
FacilityGenID   int 
Submitted   ud_DefaultBitFalse:bit

附件

AttachmentGenId int 
FileName    varchar(255)    
FileDescription varchar(255)    
UploadDate  ud_DefaultDate:datetime 
DocumentData    varbinary(MAX)  
MimeType    varchar(30) 
Archive ud_DefaultBitFalse:bit  
UpdateBy    int 
UpdateDate  ud_DefaultDate:datetime 
  1. 文档列表表包含文档列表。
  2. DocumentStepLevel是一个将DocumentList中的文档与步骤级别相关联的表。我们现在有六个步骤,每个步骤都有一些与之相关的文档。
  3. DocumentAttachment表是在DocumentStepLevel和Attachment表之间创建关系的联结/关系表。
  4. 附件表具有上传到系统的实际文件数据
  5. 问题:

    我需要编写一个查询来获取以下列。

    DocumentList.[DocumentDescription] 
    DocumentList.[DocumentName]
    DocumentStepLevel.[DocumentStepID]
    DocumentStepLevel.[StepLevelCode]
    DocumentAttachment.[DocumentAttachmentGenID]
    DocumentAttachment.[FacilityGenID]
    DocumentAttachment.[Submitted]
    Attachment.[FileName]
    Attachment.[FileDescription]
    Attachment.[UploadDate]
    

    查询应从DocumentList表返回特定步骤级别的数据。当DocumentAttachment.[Submitted]列设置为true时,它也应该从DocumentAttachmentAttachment表返回数据。否则这些列将不返回任何内容。

    我尝试使用左外连接,但是当我将Submitted列添加到查询时会出现问题。当我添加该列进行查询时,它会停止返回任何数据,直到该标志设置为true。

2 个答案:

答案 0 :(得分:0)

SELECT  *
FROM    documentStepLevel dsl
JOIN    documentList dl
ON      dl.documentId = dsl.documentId
LEFT JOIN
        documentAttachment da
ON      da.documentStepID = dsl.documentStepId
        AND submitted = 1
LEFT JOIN
        attachment a
ON      a.attachmentGenId = da.attachmentGenId
WHERE   dsl.stepLevelCode = @stepLevelCode

答案 1 :(得分:0)

DocumentAttachment你是否已离开外部加入?

在没有看到您当前的查询的情况下很难确定,但我猜测您已经加入了DocumentAttachment,然后有类似&#34;其中documentattachment.submitted = 1&#34;?< / p>

在这种情况下,我相信它不会返回任何文件附加不存在的行,提交的内容实际上是空的。因此,您可能需要将where语句更改为&#34; where (documentattachment.submitted = 1 or documentattachment.submitted is null)&#34;

这也假设当填充DocumentAttachment时,默认情况下提交的值为0而不是空值(否则您需要一种不同的方法来确定缺少DocumentAttachment)