条件连接表

时间:2015-03-14 21:30:19

标签: sql sql-server join

我是创建SQL请求的新手,加入多表后会感到困惑。这是我的问题。 数据库引擎是Microsoft SQL Server。 我的列有以下四个表:

     document(doc_id, doc_name, ref_type1, ref_type2, etc)
     document_references(doc_id, ref_type, ref_id)
     reference_type1 (ref_id, ref_value)
     reference_type2 (ref_id, ref_value)

因此,当填充document.ref_type1字段时,会添加一个字符串到document_references。

我需要制作以下某种报告:

    doc_name, etc, reference_type1.ref_value, reference_type2.ref_value

这意味着我需要将reference_type1和reference_type2表连接到文档表。 我正在尝试这个

    document left outer join document_references as refs1
             on (document.doc_id = document_references. doc_id and refs.ref_type = type1)
   refs1  left outer join reference_type1 on
   refs.ref_value = reference_type1.ref_id 
     document left outer join document_references as refs2
             on (document.doc_id = document_references. doc_id and refs2.ref_type = type2)
    refs  left outer join reference_type2 on
   refs.ref_value = reference_type2.ref_id

我的输出包含所有需要的字段,并且令人惊讶地工作正常,但是存在问题。如果reference_type2缺少某些值,则不显示带有doc_name等的整个字符串和reference_type1.ref_value。我猜同样是关于reference_type1,但它的表似乎没有空值。如何在结果表中显示空值而不是错过整个字符串? 提前谢谢!

P.S。我的请求看起来像

    SELECT  document.Name   
    --etc   
    , reference_type1.ref_value
    , reference_type2.ref_value
    FROM document 
    LEFT OUTER join document_references as docRefs1
            on document.doc_id = docRefs1.doc_id
             JOIN reference_type1
                ON docRefs1.ref_id = reference_type1.ref_id

    LEFT OUTER join document_references as docRefs2
            on document.doc_id = docRefs2.doc_id
             JOIN reference_type2
                ON docRefs2.ref_id = reference_type2.ref_id

问题是如果未填充document.ref_type,则字符串不会显示在结果中。如何使其显示为空值?

1 个答案:

答案 0 :(得分:0)

如果您将连接条件指定为ref_type = type1,则会收到错误消息,指出列type1不存在。我假设ref_type是varchar,并且查询中指定的值是document_references表中的值。

select 
    d.doc_name, 
    --etc, 
    r1.ref_value, 
    r2.ref_value
from 
    document d
    inner join document_references dr
        on dr.doc_id = d.doc_id
    left outer join reference_type1 r1
        on r1.ref_id = dr.ref_id
        and dr.ref_type = 'type1' 
    left outer join reference_type2 r2
        on r2.ref_id = dr.ref_id
        and dr.ref_type = 'type2'

感谢您根据自己的回答添加有用的标签(esp数据库引擎)可以帮助我们。但是,当你说你发布的查询正在工作时,我看不出它可能是什么,它实际上让我感到困惑。幸运的是,你的其余问题是有道理的。我只是说如果你尽可能清楚,你会更快得到更好的回应。如果您需要我为您清理任何内容或需要进一步的帮助,请告诉我。