我现在正在更新网站,这可能会产生大量的查询!
以简单的形式,有3个表格;
更新 UpdateID Files_FileID Pages_PageID UpdateDate
信息页 PAGEID 的PageTitle
文件 写到FileID FileTitle
Updates表中的Files_FileID链接到Files表中的FileID Updates表中的Pages_PageID链接到Pages表中的PageID
目前,代码在Updates表上执行select查询,然后在Pages_PageID具有值的情况下循环遍历在Pages表上为每个结果运行另一个查询的结果,或者如果Files_FileID具有值,则在Files表上循环。现在,当网站最初在大约15年前完成时,这可能是好的(如果做得不好),但我正准备添加近2000个将在更新表中列出的新文件!
我想更改它(如果可能)以运行一个查询。可以这样做吗?
我可以看到我可以将它分成两个查询,一个用于Pages,一个用于文件,但是后来我有两个基于UpdateDate的结果,我无法在正确的订单。
答案 0 :(得分:6)
据推测,您希望获得正在更新的内容的类型和标题。
你的问题的答案是适当的加入应该是一个很大的好处。在这种情况下,以下可能会做你想要的:
select u.updateid, updatedate,
(case when f.fileid is not null then 'File' else 'Page' end) as which,
coalesce(FileTitle, PageTitle) as title
from updates u left join
files f
on u.files_fileid = f.fileid left join
pages p
on u.pages_pageid = p.pageid;
这假定每条记录仅引用一个页面或一个文件,但不是两个。此外,为了提高性能,您需要在每个表中的主键上建立索引(如果它们被定义为主键,则会有索引)。