0

嘿 sql newb,我有这个问题,我想创建一个视图,其中包含某个时间范围(3 月 - 4 月)之间产品的不同预订信息

我想出了这个,但不是显示特定的时间范围,而是显示所有内容

CREATE VIEW sailors_view1 
AS
   SELECT sailors.sid, sname, rating
   FROM sailors, reserves
   WHERE start_date BETWEEN '8 March, 2007' AND '14 April, 2007'
   With Check Option
GO

我用这个来测试:SELECT * From sailors_view1

更新:表定义

CREATE TABLE sailors 
  (sid CHAR(5), 
   fname VARCHAR(10), sname VARCHAR(10), 
   street_address VARCHAR(20), 
   suburb VARCHAR(20), 
   rating INT, age INT, phone CHAR(3)) 

CREATE TABLE dbo.reserves 
  (sid CHAR(5), 
   bid CHAR(3), 
   start_date DATETIME, 
   end_date DATETIME, 
   rname VARCHAR(10)) 
4

2 回答 2

2

你的 from 子句中有一个隐式的交叉连接,它肯定会给你比你预期的更多的记录。您可能应该使用标准连接子句(内连接、左连接、右连接等)或在 where 子句中包含连接条件,如下所示:

where sailors.sid = reserves.sid

另外,我不记得在 sql server 中看到过这样的日期格式。您的 start_date 列是日期时间数据类型,还是 char/varchar?

即使有这两个问题,我不确定他们会解释为什么你会得到所有记录,但我会检查他们,看看你是否更接近答案。

于 2011-05-29T06:02:53.313 回答
1

我建议不要使用老式的 JOIN 表,表后用逗号分隔。如果您忘记(就像您所做的那样)在 WHERE 子句中定义连接条件,这会导致意外结果。

请始终使用新的 ANSI 风格的 JOIN 语法——像这样:

CREATE VIEW sailors_view1 
AS
   SELECT 
       s.sid, s.sname, r.rating
   FROM 
       dbo.sailors s 
   INNER JOIN
       dbo.reserves r ON s.sid = r.sid
   WHERE 
       r.start_date BETWEEN '20070308' AND '20070414'
   WITH CHECK OPTION
GO

通过这个显式INNER JOIN和一个ON s.sid = r.sid子句,您可以清楚地说明您连接这两个表的意图,并使用该sid列作为连接行的通用条件。

此外,为了安全起见(独立于任何语言或区域设置),我将始终使用 ISO 8601 日期格式YYYYMMDD- 它适用于所有设置,并且如果您的服务器具有不同的语言设置,它不会突然崩溃。 .

于 2011-05-29T07:47:26.987 回答