2011-05-29 41 views
0

嘿这里SQL福利局,我有这个问题,这我想创建一个包含一定的时间框架之间的产品的不同的预约信息的视图(3至4月)SQL Server的“若干意见”和之间

我想出了这个,但不是显示的具体时间框架,它只是表示一切

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)) 
+1

'start_date'是DATETIME/DATETIME2/DATE列吗? – 2011-05-29 05:56:35

+1

你可以发布水手和储备表的定义吗? – Matt 2011-05-29 05:58:15

+0

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)) – Ari 2011-05-29 07:16:43

回答

2

你在from子句中有一个隐式的交叉连接,它肯定会给你比你期望的更多的记录。你应该要么使用一个标准的连接语句(内部连接,左,右等)或包括您的where子句中连接条件为:

where sailors.sid = reserves.sid 

而且,我不记得看到一个日期格式像在sql服务器。您的start_date列是日期时间数据类型还是char/varchar?

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

+1

你会使用显式JOIN..ON语法nowadays ... http://stackoverflow.com/questions/5654278/sql-join-is-there-a-difference-between-using-on-or-where/5654338#5654338 – gbn 2011-05-29 07:34:19

+0

@gbn我不是主张旧的风格加入,只是保持简单的海报 – jlnorsworthy 2011-05-30 06:08:58

1

我会推荐而不是使用旧式JOIN,只用table后面,用逗号分隔。如果您忘记(像您那样)在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 JOINON s.sid = r.sid条款,明确声明你的加入这两个表,并使用sid的意图列作为加入行上的通用标准。另外,为了安全起见(独立于任何语言或区域设置),我总是使用ISO 8601日期格式 - YYYYMMDD - 它可以在所有设置中运行,并且在您的服务器有故障时不会突然崩溃不同的语言设置。