1

我有一个 sql server 查询,它返回的行比我预期的要多:

select 
   b.isbn, l.lend_no, s.first_name
from 
   dbo.books b, dbo.lending l, dbo.students s 
where 
   (l.act between '4/16/2013' and '4/16/2013') 
   and (l.stat ='close')`

我想做的是得到isbn,该书lend_nostudent name归还日期在给定日期之间并且借出状态已关闭,我的借出表只有 2 个在给定日期归还的借出,但查询给了我 304 行

4

3 回答 3

3

您当前的查询从导致检索意外结果的三个表中获取笛卡尔积。您需要定义关系或表应如何连接,例如

select b.isbn, l.lend_no, s.first_name
from    dbo.books b
        INNER JOIN dbo.lending l
            ON c.Colname = l.ColName -- << define condition here
        INNER JOIN dbo.students s 
            ON ......                -- << define condition here
where   l.act between '4/16/2013' and '4/16/2013' and 
        l.stat ='close'

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-04-17T08:04:06.160 回答
2

您没有在表之间定义任何连接条件,因此您将获得笛卡尔积。

尝试这样的事情:

SELECT
   b.isbn, l.lend_no, s.first_name
FROM
   dbo.books b
INNER JOIN
   dbo.lending l ON l.Book_id = b.Book_id   -- just guessing here
INNER JOIN
   dbo.students s ON l.student_id = s.student_id   -- just guessing here
WHERE
   l.act BETWEEN '20130416' AND '20130416' 
   AND l.stat = 'close'

根据需要定义连接条件 - 我不知道您的表,您必须找出分别链接两个表的列。

我还使用了正确的 ANSI JOIN语法——不要只列出一堆用逗号分隔的表,这在 20 多年前已被排除在 SQL 标准之外(SQL 1992)。

另外:为了安全起见,我总是使用 ISO-8601 日期格式YYYYMMDD- 这是唯一适用于所有 SQL Server 版本以及所有语言、区域和日期格式设置的格式。

于 2013-04-17T08:04:07.580 回答
0

您的FROM条款没有按照您的预期进行。通过以这种方式指定表,您可以进行完全连接,从而为您提供笛卡尔积。您需要使用正确的表连接语法。

这是对表连接的一个很好的解释:http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

于 2013-04-17T08:06:33.377 回答