我尝试在安装了WSUS数据库的MSSQL 2005 Express服务器上进行搜索。我想获取当前版本的sepcific更新的文件名和摘要值。这是我想要运行的查询:
SELECT
*
FROM
tbRevision as rev
join tbLocalizedPropertyForRevision as lpfr on lpfr.RevisionID = rev.RevisionID
join tbLocalizedProperty as lp on lp.LocalizedPropertyID = lpfr.LocalizedPropertyID
join tbFileForRevision as ffr on rev.RevisionID = ffr.RevisionID
WHERE
lpfr.LanguageID = 1033 and
rev.IsLatestRevision = 1 and
rev.IsBeta = 0 and
lp.Title like '%931125%';
问题是该查询将找不到任何内容,尽管其中包含该KB编号的修订版。如果我从查询中删除最后一个连接线join tbFileForRevision as ffr on rev.RevisionID = ffr.RevisionID
,我会收到所有结果。
想知道出了什么问题我从另一边开始了一个新的查询,知道了文件名:
SELECT
*
FROM
tbLocalizedPropertyForRevision as lpfr
join tbRevision as r on r.RevisionID = lpfr.RevisionID
join tbFileForRevision as ffr on ffr.RevisionID = r.RevisionID
join tbFile as f on f.FileDigest = ffr.FileDigest
join tbLocalizedProperty as lp on lp.LocalizedPropertyID = lpfr.LocalizedPropertyID
WHERE
f.FileName like '%rootsupd%'
在此结果集中,字段Title
始终为“二进制0”,Description
和ReleaseNotes
始终填充NULL,尽管LocalizedPropertyID
已正确填充并匹配来自LocalizedPropertyID
tbLocalizedPropertyForRevisiontbLocalizedPropertyForRevision
我的查询是这样的吗?我做错了什么?如果您需要有关架构的更多详细信息,我很乐意提供它们。
编辑:链接到SUSDB Diagram如果您需要其他格式,请告诉我如何提供它。许多使用Microsoft软件的公司都有WSUS,也许您可以自己访问该服务器。
答案 0 :(得分:1)
在调试多连接查询时,大多数表都是WHERE
子句的一部分,这有助于我将查询分解为可以单独测试的部分,如下所示:
SELECT *
FROM
tbRevision as rev
left join (
select *
from tbLocalizedPropertyForRevision as lpfr
where lpfr.LanguageID = 1033
) as lpfr
on lpfr.RevisionID = rev.RevisionID
left join (
select *
from tbLocalizedProperty as lp
where lp.Title like '%931125%'
) as lp
on lp.LocalizedPropertyID = lpfr.LocalizedPropertyID
left join (
select *
from tbFileForRevision
) as ffr
on rev.RevisionID = ffr.RevisionID
WHERE
rev.IsLatestRevision = 1 and
rev.IsBeta = 0
运行上面的内容会给我所有符合rev
表标准的记录。 (左连接确保我得到了所有东西。)
然后我可以将联接更改为lpfr
回到内部联接,看看我得到了多少记录。
然后我会将该联接更改回left join
并添加到最底部的WHERE
子句:
and lpfr.LanguageID = Is Null
向我展示我可能不想错过的遗失。
这种方法的优点在于您可以突出显示特定的代码块:
select *
from tbLocalizedPropertyForRevision as lpfr
where lpfr.LanguageID = 1033
加上你能想到的其他临时调试标准,并单独运行它以查看你得到的记录。
找到问题后,您可以将查询恢复为原始格式,在这种情况下显然需要使用内部联接,以便部署到您的应用中。
由于您比我们更熟悉您的模式和数据,因此这种有条理的分析可能会帮助您更快地得到答案。