关于 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 多重标准的主要内容,如果未能解决你的问题,请参考以下文章

关于T-SQL的多重IF-ELSE嵌套

如何缩短 T-SQL 中的 WHERE 子句

PHP MySQL Where 子句

在t-sql中,子查询只能放在where子句中吗

PHP MySQL Where 子句

关于sql语句添加where条件问题,用java语句