当前位置:  开发笔记 > 编程语言 > 正文

使用OR进行SELECT,包括表连接

如何解决《使用OR进行SELECT,包括表连接》经验,为你挑选了1个好方法。

我有一个包含三个表的数据库:书籍(书籍详细信息,PK是CopyID),关键词(关键词列表,PK是ID)和KeywordsLink,这是书籍和关键词之间的多个链接表,带有字段ID, BookID和KeywordID.

我正在尝试在我的应用中创建一个高级搜索表单,您可以在其中搜索各种条件.目前我已经与Title,Author和Publisher合作(全部来自Book表).它产生如下SQL:

SELECT * FROM Books WHERE Title Like '%Software%' OR Author LIKE '%Spolsky%';

我想扩展此搜索以使用标记进行搜索 - 基本上是添加另一个OR子句来搜索标记.我尝试通过执行以下操作来完成此操作

SELECT *
    FROM Books, Keywords, Keywordslink
    WHERE Title LIKE '%Joel%'
       OR (Name LIKE '%good%' AND BookID=Books.CopyID AND KeywordID=Keywords.ID)

我认为使用括号可能会将第二部分分成它自己的kinda子句,因此仅在该部分中评估连接 - 但它似乎并非如此.它给我的全部是一本书的多个副本的长列表,满足了这Title LIKE '%Joel%'一点.

有没有办法使用纯SQL执行此操作,或者我必须使用两个SQL语句并将它们组合在我的应用程序中(在此过程中删除重复项).

如果这很重要,我现在正在使用MySQL,但该应用程序使用ODBC,我希望使它与数据库无关(甚至可能最终使用SQLite或者拥有它,以便用户可以选择使用哪个数据库).



1> Neil Barnwel..:

您需要将3个表连接在一起,这为您提供了一个表格结果集.然后,您可以检查您喜欢的任何列,并确保获得明显的结果(即没有重复).

像这样:

select distinct b.*
from books b
left join keywordslink kl on kl.bookid = b.bookid
left join keywords k on kl.keywordid = k.keywordid
where b.title like '%assd%'
or k.keyword like '%asdsad%'

您还应该尝试避免使用百分号(%)启动LIKE值,因为这意味着SQL Server无法在该列上使用索引并且必须执行完整(和慢速)表扫描.这开始使您的查询成为"开始于"查询.

也许考虑SQL Server中的全文搜索选项.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有