关于 Where 子句的 T-Sql 多重标准
Posted
技术标签:
【中文标题】关于 Where 子句的 T-Sql 多重标准【英文标题】:T-Sql Multiple Criteria On Where Clause 【发布时间】:2010-06-01 11:21:49 【问题描述】:场景
我使用的是 SQL Server 2005 我有一个 T-Sql 查询,它有多个条件来搜索 WHERE 子句。 我敢肯定,我这样做的效率很低,而且很长。 如何确保不必手动输入所有条件? 相反,我想通过 SELECT * 子句传递条件。
当前查询代码
SELECT * FROM tblBooks
WHERE BookID = 1
OR BookID = 4
OR BookID = 5
OR BookID = 7
OR BookID = 8
OR BookID = 11
OR BookID = 14
建议的 PSEUDO 查询代码
SELECT * FROM tblBooks
WHERE BookID = (SELECT BookID FROM tblAuthors WHERE Genre = 'Fiction')
代码注释
正如您从提议的伪代码中看到的那样,其想法是从另一个查询中选择 BookID 列表,并将此条件列表传递给实际查询本身。 我该如何正确地做到这一点?
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:你在找这样的东西吗
SELECT * FROM tblBooks
WHERE BookID in (SELECT BookID FROM tblAuthors WHERE Genre = 'Fiction')
如果存在书籍 ID,这将返回表 tblAuthors 中的所有数据
【讨论】:
【参考方案2】:你的伪代码,不是太伪。将 = 更改为 IN 即可。
SELECT * FROM tblBooks
WHERE BookID IN (SELECT BookID FROM tblAuthors WHERE Genre = 'Fiction')
【讨论】:
【参考方案3】:使用连接:
SELECT b.*
FROM tblBooks b
INNER JOIN
tblAuthors a
ON b.BookID = a.BookID
WHERE a.Genre = 'Fiction'
我假设这些不是你真正的桌子?我不明白为什么 Genre 属性不在书本身上。许多作者跨多种体裁写作(以 Iain Banks 为例)。
【讨论】:
书籍属于流派和作者以流派写作,所以我会将流派作为自己的表,其中包含书籍和流派之间的连接表(假设一本书可以在多种类型中,即使这不是典型的)以及作者和类型。 是的,一个单独的流派查找表当然是明智的,在作者和流派之间有一个链接表。不确定书籍...【参考方案4】:只是把替代品扔在那里:
SELECT tblBooks.*
FROM tblBooks
WHERE EXISTS (SELECT *
FROM tblAuthors
WHERE tblBooks.BookID = tblAuthors.BookID
AND tblAuthors.Genre = 'Fiction');
SELECT tblBooks.*
FROM tblBooks
WHERE tblBooks.BookID = ANY
(SELECT tblAuthors.BookID
FROM tblAuthors
WHERE tblAuthors.Genre = 'Fiction');
【讨论】:
以上是关于关于 Where 子句的 T-Sql 多重标准的主要内容,如果未能解决你的问题,请参考以下文章