我有一个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_no
和student name
图书的返回日期是在给定日期和贷款状态之间关闭,我的借阅表只有2个退回在给定的日期,但查询给我304行
答案 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