SQL Server «представления» и между - PullRequest
0 голосов
/ 29 мая 2011

Привет, sql newb здесь, у меня есть эта проблема, которая, я полагаю, должна создать представление, которое содержит информацию о различных бронированиях продукта в течение определенного периода времени (март - апрель)

Я придумал это, но вместо отображения определенного периода времени он просто показывает все

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

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

У вас есть неявное перекрестное объединение в предложении from, которое, безусловно, даст вам больше записей, чем вы ожидаете. Вам, вероятно, следует либо использовать стандартное предложение соединения (внутреннее соединение, слева, справа и т. Д.), Либо включить условие соединения в предложение where, как в:

where sailors.sid = reserves.sid

Кроме того, я не помню, чтобы видел такой формат даты на сервере SQL. Ваш столбец start_date является типом данных datetime или это тип char / varchar?

Даже с обоими этими проблемами я не уверен, что они объяснят, почему вы получаете все записи, но я проверю их и посмотрим, приблизитесь ли вы к ответу.

1 голос
/ 29 мая 2011

Я бы рекомендовал , а не , используя старый стиль JOIN с таблицей за таблицей, разделенной запятыми. Это приведет к неожиданным результатам, если вы забудете (как и вы) определить условие соединения в предложении WHERE.

Пожалуйста, всегда используйте новый синтаксис JOIN в стиле ANSI - что-то вроде этого:

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 - он работает во всех настройках и не падает внезапно, если ваш сервер имеет другую настройку языка ..

...