SQL Server查询返回的行数超出预期

时间:2013-04-17 07:58:25

标签: sql-server

我有一个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')`

我想要的是获取isbnlend_nostudent name图书的返回日期是在给定日期和贷款状态之间关闭,我的借阅表只有2个退回在给定的日期,但查询给我304行

3 个答案:

答案 0 :(得分: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'

要进一步了解联接,请访问以下链接:

答案 1 :(得分: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版本的唯一格式服务器以及所有语言,区域和日期格式设置。

答案 2 :(得分:0)

您的FROM条款未达到预期效果。通过指定表格,您正在进行完全连接,这将为您提供笛卡尔积。您需要使用proper table join syntax.

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

相关问题