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 句に暗黙のクロス結合があり、予想よりも多くのレコードが確実に得られます。おそらく、標準の結合句 (inner join、left、right など) を使用するか、次のように where 句に結合条件を含める必要があります。

where sailors.sid = reserves.sid

また、SQL サーバーでそのような日付形式を見た記憶がありません。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 JOINON s.sid = r.sidを使用して、これら 2 つのテーブルを結合する意図を明確に示しsid、行を結合するための共通基準として列を使用します。

また、安全のために (言語や地域の設定に関係なく)、私は常に ISO 8601 日付形式を使用しますYYYYMMDD。これはすべての設定で機能し、サーバーの言語設定が異なっていても突然落ちることはありません。 .

于 2011-05-29T07:47:26.987 に答える