1

次のデータベースがあります。

create table Hotel  (
   HNo char(4),
   Name varchar(20)   not null,
   Address varchar(50),
   Constraint PK_Hotel Primary Key (HNo))
)


create table Room  (
   RNo char(4),
   HNo char(4),
   Type char(6) not null,
   Price decimal (7,2),
   Constraint PK_Room Primary Key (HNo, RNo),
   Constraint FK_Room Foreign Key (HNo)
   references Hotel (HNo)
)


create table Guest  (
   GNo char(4),
   Name varchar(20) not null,
   Address varchar(50),
   Constraint PK_Guest Primary Key (GNo)

)


create table Booking   (
   HNo char(4),
   GNo char(4),
   DateFrom date,
   DateTo date,
   RNo char(4),
   Constraint PK_Booking Primary Key (HNo, GNo, DateFrom),
   Constraint FK_Booking Foreign Key (GNo)
   references Guest (GNo),
   Constraint FK_Booking_room Foreign Key (HNo, RNo)
   references Room (HNo, RNo),
   Constraint FK_Booking_hotel Foreign Key (HNo)
   references Hotel (HNo)
)

私が苦労しているのは、を使用してdateto=> <=datefrom機能させることです。

1997 年 3 月 26 日については、すべてのホテルのすべての部屋の詳細を、その部屋に滞在していたゲストの名前を含めてリストする必要があります。テーブルの結合などは悪くないのですが、指定された日付に全体として結合する方法がわかりませんか? 何か案は?

4

2 に答える 2

1
SELECT
  h.Name,
  h.Address,
  r.RNo,
  r.HNo,
  r.Type,
  r.Price,
  G.Name,
  G.Address,
  ...
FROM Hotel         AS h
INNER JOIN Room    AS r  ON h.HNo = r.HNo
INNER JOIN Guest   AS g  ON r.RNo = g.RNo
INNER JOIN Booking AS b  ON b.GNo = g.GNo
                        AND b.HNo = h.HNo
WHERE b.DateFrom <= @DateFrom
  AND b.DateTo   => @DateTo;
于 2013-03-25T07:31:07.870 に答える
1
  SELECT b.datefrom, b.dateto, h.name AS hotelname
         , b.rno
         , r.type
         , g.name AS guestname
    FROM booking b
    JOIN hotel h ON b.hno = h.hno
    JOIN guest g ON g.gno = b.gno
    JOIN room r ON b.rno = r.rno
   WHERE @yourDate BETWEEN b.datefrom AND b.dateto

編集 :

@yourDate最後の行の を、DBMS でサポートされている適切な式に置き換えます。

たとえば、Oracle には、TO_DATE指定された文字列を日付に変換する関数がありますTO_DATE('26-MAR-1997') BETWEEN b.datefrom AND b.dateto。SQL Server にはCAST機能があります。

于 2013-03-25T07:31:37.170 に答える