我正在旧网站上做一些工作,它会带回项目列表。
目前,它执行查询从一个表中选择列表项,然后遍历该查询 - 并根据第一个表中的值 - 对第二个表执行查询,或对第三个和第四个表执行查询表。因此,包含100个项目的列表可能会导致运行101个查询!
这是基本的表格布局;
**tblLists** ListID, ListType, ListTitle, tblPages_PageID, tblFiles_FileID, LinkAddress, Description
**tblPages** PageID, PageTitle, PagePath
**tblFiles** FileID, FileName, tblFileTypes_FileTypesID
**tblFileTypes** FileTypeID, FileTypeDescription, FileTypeIcon
tblLists.ListType可以是4种类型之一。它可以是;
1)'Page'在这种情况下,tblLists.tblPages_PageID与tblPages表中的PageID相关。如果它的'Page'它在循环中运行一个查询,它从tblPages中选择PageTitle,PagePath,其中tblPages.PageID = #tblPages_PageID#
2)'文件',在这种情况下,tblLists.tblFiles_FileID与tblFiles表中的FileID相关。如果它的'File'它在循环中运行一个查询,它选择tblFiles.FileName,tblFileTypes.FileTypeDescription,tblFileType.tblFileTypeIcon FROM tblFiles,tblFileTypes WHERE tblFiles.FileID =#tblFiles_FileID#和tblFiles.tblFileTypes_FileTypesID = tblFileTypes.FileTypeID
3)'链接',在这种情况下'LinkAddress'将有一个值。无需进一步查询。
4)'文字',在这种情况下'描述'将有一个值。无需进一步查询。
如果可能,我希望能够将主查询和所有后续查询合并到一个查询中。
所以类似(对于if语句,sql显然不正确 - 但这就是我想要实现的目标!),
select tblLists.ListType , tblLists.ListTitle , tblPages.PageTitle
, tblPages.PagePath , tblFiles.FileName,tblFileTypes.FileTypeDescription
, tblFileTypes.FileTypeIcon
FROM tblLists , tblPages , tblFiles , tblFileTypes
WHERE ...
if type = 'page'
select PageTitle, PagePath
from tblPages
where tblPages.PageID = tblLists.tblPages_PageID
or if type = 'file'
select tblFiles.FileName, tblFileTypes.FileTypeDescription
, tblFileType.tblFileTypeIcon
FROM tblFiles
, tblFileTypes
WHERE tblFiles.FileID = tblLists.tblFiles_FileID
and tblFiles.tblFileTypes_FileTypesID = tblFileTypes.FileTypeID
or if type = 'link' no other work needed
or if type = 'text' no other work needed
这可能吗?!
然后我可以运行并输出一个查询,如果类型是'文件'我会从tblFiles和tblFileTypes表中获取所需的信息,如果类型是'Page'我将拥有我需要的东西来自tblPages表,如果它的'Link'或'Text'我也有这两个。
感谢您的帮助:)
更新
感谢Dan推动我的大脑,我已经走到了这一步;
SELECT tblLists.ListType , tblLists.ListTitle , tblLists.LinkAddress , tblLists.Description , tblFiles.FileName , tblPages.PageTitle , tblPages.PagePath
FROM tblLists
LEFT JOIN tblFiles ON tblLists.tblFiles_FileID = tblFiles.FileID
LEFT JOIN tblPages ON tblLists.tblPages_PageID = tblPages.PageID
WHERE tblLists.ListType = 'File'
AND tblLists.tblFiles_FileID = tblFiles.FileID
OR tblLists.ListType = 'Page'
AND tblLists.tblPages_PageID = tblPages.PageID
OR tblLists.ListType = 'Link'
OR tblLists.ListType = 'Text'
ORDER BY tblLists.ListTitle
我现在需要的是将tblFileTypes.ReferenceID = tblFiles.FileTypes_ReferenceID放入查询中 - 我是否需要左连接左边的连接?! ......
答案 0 :(得分:1)
是的,这是可能的。这种结构应该对你有所帮助。你必须弄清楚细节。
select yourFields
from table1 t1 join table2 t2 on t1.something = t2.something
where someConditionsAreMet
and
(
(someMoreConditionsAreMet)
or
(someOtherConditionsAreMet)
or
(yetAnotherSetOfConditionsAreMet)
)
在select子句中,coalesce函数可以帮助您使用所需的任何条件逻辑。
答案 1 :(得分:0)
所以,我有点愚蠢......这似乎很有效,就像那个一样简单!
SELECT tblLists.ListType , tblLists.ListTitle , tblLists.LinkAddress , tblLists.Description , tblFiles.FileName , tblPages.PageTitle , tblPages.PagePath , tblFileTypes.FileTypeDescription , tblFileTypes.FileTypeIcon
FROM tblLists
LEFT JOIN tblFiles ON tblLists.tblFiles_FileID = tblFiles.FileID
LEFT JOIN tblFileTypes ON tblFiles.tblFileTypes_FileTypeID = tblFileTypes.FileTypeID
LEFT JOIN tblPages ON tblLists.tblPages_PageID = tblPages.PageID
WHERE tblLists.ListType = 'File'
AND tblLists.tblFiles_FileID = tblFiles.FileID
AND tblFiles.tblFileTypes_FileTypeID = tblFileTypes.FileTypeID
OR tblLists.ListType = 'Page'
AND tblLists.tblPages_PageID = tblPages.PageID
OR tblLists.ListType = 'Link'
OR tblLists.ListType = 'Text'
ORDER BY tblLists.ListTitle
再次感谢Dan,它只是看到了为我触发它的WHERE / AND / OR!我进入了我的脑海,这将是非常复杂的! :)