关于Where子句的T-Sql多重标准

时间:2010-06-01 11:21:50

标签: sql-server tsql

方案

我正在使用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列表,并将这个条件列表传递给实际的查询本身。 我该怎么做呢?

非常感谢。

4 个答案:

答案 0 :(得分:3)

你正在寻找像这样的东西

SELECT * FROM tblBooks
WHERE BookID in (SELECT BookID FROM tblAuthors WHERE Genre = 'Fiction') 

如果book id在那里,这将返回表tblAuthors中的所有数据

答案 1 :(得分:3)

你的伪代码,不是太伪了。将=更改为IN和完成。

SELECT * FROM tblBooks 
WHERE BookID IN (SELECT BookID FROM tblAuthors WHERE Genre = 'Fiction')

答案 2 :(得分:2)

使用联接:

SELECT  b.*
FROM    tblBooks b
        INNER JOIN
                tblAuthors a
                ON b.BookID = a.BookID
WHERE   a.Genre = 'Fiction'

我认为这些不是你真正的桌子吗?我不明白为什么Genre属性不在书本身上。许多作者都写过多种类型(以Iain Banks为例)。

答案 3 :(得分:0)

只是抛出替代品:

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');