我是创建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,则字符串不会显示在结果中。如何使其显示为空值?
答案 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数据库引擎)可以帮助我们。但是,当你说你发布的查询正在工作时,我看不出它可能是什么,它实际上让我感到困惑。幸运的是,你的其余问题是有道理的。我只是说如果你尽可能清楚,你会更快得到更好的回应。如果您需要我为您清理任何内容或需要进一步的帮助,请告诉我。