Database design E保留表具有资源表中的匹配时段列。当在资源可用的时间段内进行预订时,将在列中放置一个“真值”。可用于预订的资源由找到 聚集当天每个时段的预订值 建立可用资源的列表 显示没有预订的资源
在第三步的计算中,我们可以排除任何期间可用性为“假”的资源,然后查看保留表中的合计值,并说明如果存在保留(“真”),则可用性为“假” 下面的代码是用SQLServer2008编写的,并演示了上述主体Database design E保留表具有资源表中的匹配时段列。当在资源可用的时间段内进行预订时,将在列中放置一个“真值”。可用于预订的资源由找到 聚集当天每个时段的预订值 建立可用资源的列表 显示没有预订的资源,database-design,Database Design,在第三步的计算中,我们可以排除任何期间可用性为“假”的资源,然后查看保留表中的合计值,并说明如果存在保留(“真”),则可用性为“假” 下面的代码是用SQLServer2008编写的,并演示了上述主体 /****** Object: Table [dbo].[Classroom] Script Date: 05/20/2011 08:25:53 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = O
/****** Object: Table [dbo].[Classroom] Script Date: 05/20/2011 08:25:53 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Classroom]') AND type in (N'U'))
DROP TABLE [dbo].[Classroom]
GO
/****** Object: Table [dbo].[Classroom] Script Date: 05/20/2011 08:25:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Classroom]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Classroom](
[ClassRoomID] [int] IDENTITY(1,1) NOT NULL,
[CrIsAvailablePeriod01] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod01 DEFAULT 0,
[CrIsAvailablePeriod02] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod02 DEFAULT 0,
[CrIsAvailablePeriod03] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod03 DEFAULT 0,
[CrIsAvailablePeriod04] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod04 DEFAULT 0,
[CrIsAvailablePeriod05] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod05 DEFAULT 0,
[CrIsAvailablePeriod06] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod06 DEFAULT 0,
[CrIsAvailablePeriod07] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod07 DEFAULT 0,
[CrIsAvailablePeriod08] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod08 DEFAULT 0,
[CrIsAvailablePeriod09] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod09 DEFAULT 0,
[CrIsAvailablePeriod10] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod10 DEFAULT 0,
[CrIsAvailablePeriod11] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod11 DEFAULT 0,
[CrIsAvailablePeriod12] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod12 DEFAULT 0,
[CrIsAvailablePeriod13] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod13 DEFAULT 0,
[CrIsAvailablePeriod14] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod14 DEFAULT 0,
[CrIsAvailablePeriod15] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod15 DEFAULT 0,
[CrIsAvailablePeriod16] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod16 DEFAULT 0,
[CrIsAvailablePeriod17] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod17 DEFAULT 0,
[CrIsAvailablePeriod18] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod18 DEFAULT 0,
[CrIsAvailablePeriod19] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod19 DEFAULT 0,
[CrIsAvailablePeriod20] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod20 DEFAULT 0,
[CrIsAvailablePeriod21] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod21 DEFAULT 0,
[CrIsAvailablePeriod22] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod22 DEFAULT 0,
[CrIsAvailablePeriod23] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod23 DEFAULT 0,
[CrIsAvailablePeriod24] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod24 DEFAULT 0,
[CrShortName] [char](10) NOT NULL,
[CrLongName] [varchar](128) NULL,
CONSTRAINT [PK_Classroom] PRIMARY KEY CLUSTERED
(
[ClassRoomID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING ON
GO
INSERT INTO [deleteme].[dbo].[Classroom]
([CrIsAvailablePeriod01]
,[CrIsAvailablePeriod02]
,[CrShortName])
VALUES
(0,0,'A1')
,(0,1,'B1')
,(1,0,'C1')
,(1,1,'D1')
GO
USE [deleteme]
GO
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation] DROP CONSTRAINT [FK_Reservation_Classroom]
GO
USE [deleteme]
GO
/****** Object: Table [dbo].[Reservation] Script Date: 05/20/2011 08:29:59 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Reservation]') AND type in (N'U'))
DROP TABLE [dbo].[Reservation]
GO
USE [deleteme]
GO
/****** Object: Table [dbo].[Reservation] Script Date: 05/20/2011 08:29:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Reservation]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Reservation](
[ReservationId] [int] Identity (1,1)NOT NULL,
[ResClassroomID] [int] NOT NULL,
[ResDate] [date] NOT NULL,
[ResIsReservedPeriod01] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod01 DEFAULT 0,
[ResIsReservedPeriod02] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod02 DEFAULT 0,
[ResIsReservedPeriod03] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod03 DEFAULT 0,
[ResIsReservedPeriod04] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod04 DEFAULT 0,
[ResIsReservedPeriod05] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod05 DEFAULT 0,
[ResIsReservedPeriod06] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod06 DEFAULT 0,
[ResIsReservedPeriod07] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod07 DEFAULT 0,
[ResIsReservedPeriod08] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod08 DEFAULT 0,
[ResIsReservedPeriod09] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod09 DEFAULT 0,
[ResIsReservedPeriod10] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod10 DEFAULT 0,
[ResIsReservedPeriod11] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod11 DEFAULT 0,
[ResIsReservedPeriod12] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod12 DEFAULT 0,
[ResIsReservedPeriod13] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod13 DEFAULT 0,
[ResIsReservedPeriod14] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod14 DEFAULT 0,
[ResIsReservedPeriod15] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod15 DEFAULT 0,
[ResIsReservedPeriod16] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod16 DEFAULT 0,
[ResIsReservedPeriod17] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod17 DEFAULT 0,
[ResIsReservedPeriod18] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod18 DEFAULT 0,
[ResIsReservedPeriod19] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod19 DEFAULT 0,
[ResIsReservedPeriod20] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod20 DEFAULT 0,
[ResIsReservedPeriod21] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod21 DEFAULT 0,
[ResIsReservedPeriod22] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod22 DEFAULT 0,
[ResIsReservedPeriod23] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod23 DEFAULT 0,
[ResIsReservedPeriod24] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod24 DEFAULT 0,
CONSTRAINT [PK_Reservation] PRIMARY KEY CLUSTERED
(
[ReservationId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation] WITH CHECK ADD CONSTRAINT [FK_Reservation_Classroom] FOREIGN KEY([ResClassroomID])
REFERENCES [dbo].[Classroom] ([ClassRoomID])
GO
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation] CHECK CONSTRAINT [FK_Reservation_Classroom]
GO
INSERT INTO [deleteme].[dbo].[Reservation]
([ResClassroomID]
,[ResDate]
,[ResIsReservedPeriod01]
,[ResIsReservedPeriod02])
VALUES
(1,'06-02-2011',1,0)
,(1,'06-02-2011',0,1)
,(2,'06-03-2011',1,1)
,(4,'06-03-2011',0,1)
GO
下面的代码将返回三个结果集。第一组是可用性计算,第二组是教室表列表,最后是预订表
declare @when date
set @when = '06-03-2011'
;With CTE_Res AS
(
SELECT
Reservation.ResClassroomID AS 'ResClassroomID'
,ResDate as 'ResDate'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod01] as int)),0)as BIT) AS'IsReserved01'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod02] as int)),0)as BIT) AS'IsReserved02'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod03] as int)),0)as BIT) AS'IsReserved03'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod04] as int)),0)as BIT) AS'IsReserved04'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod05] as int)),0)as BIT) AS'IsReserved05'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod06] as int)),0)as BIT) AS'IsReserved06'
FROM
Reservation
WHERE ResDate = @when --'2011-06-03'
GROUP BY Reservation.ResClassroomID, ResDate
)
--Select * from CTE_RES
SELECT
Classroom.ClassRoomID
,Classroom.CrShortName
, CASE Classroom.CrIsAvailablePeriod01
WHEN 0 then 0
Else 1 ^ ISNULL(CTE_Res.IsReserved01,0)
END As 'IsOpenPeriod01'
, CASE Classroom.CrIsAvailablePeriod02
WHEN 0 then 0
Else 1 ^ ISNULL(CTE_Res.IsReserved02,0)
END As 'IsOpenPeriod02'
--, CTE_Res.ResDate
, @when as [Day]
FROM
Classroom
LEFT OUTER JOIN CTE_Res
ON Classroom.ClassRoomID = CTE_Res.ResClassroomID
--WHERE ResDate = '2011-06-03'
SELECT [ClassRoomID]
,[CrShortName]
,[CrIsAvailablePeriod01]
,[CrIsAvailablePeriod02]
FROM [deleteme].[dbo].[Classroom]
SELECT TOP 200 [ResClassroomID]
,ResDate
,[ResIsReservedPeriod01]
,[ResIsReservedPeriod02]
,[ResDate]
FROM [deleteme].[dbo].[Reservation]
WHERE ResDate = @when --'2011-06-03'
您的解决方案是基本预订系统。在预订系统中,资源定义为可用期。如果业务规则是以单小时增量使用资源,那么我将设计一个资源表,其中包含24个周期来表示一天中的每一小时。如果业务规则规定资源在上午8点到上午10点期间可用,我会在表示该时间范围的时段列中放置一个“真值”。在一个单独的表中跟踪保留,并将外键返回到资源。保留表具有资源表中的匹配时段列。当在资源可用的时间段内进行预订时,将在列中放置一个“真值”。可用于预订的资源由找到
/****** Object: Table [dbo].[Classroom] Script Date: 05/20/2011 08:25:53 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Classroom]') AND type in (N'U'))
DROP TABLE [dbo].[Classroom]
GO
/****** Object: Table [dbo].[Classroom] Script Date: 05/20/2011 08:25:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Classroom]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Classroom](
[ClassRoomID] [int] IDENTITY(1,1) NOT NULL,
[CrIsAvailablePeriod01] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod01 DEFAULT 0,
[CrIsAvailablePeriod02] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod02 DEFAULT 0,
[CrIsAvailablePeriod03] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod03 DEFAULT 0,
[CrIsAvailablePeriod04] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod04 DEFAULT 0,
[CrIsAvailablePeriod05] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod05 DEFAULT 0,
[CrIsAvailablePeriod06] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod06 DEFAULT 0,
[CrIsAvailablePeriod07] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod07 DEFAULT 0,
[CrIsAvailablePeriod08] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod08 DEFAULT 0,
[CrIsAvailablePeriod09] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod09 DEFAULT 0,
[CrIsAvailablePeriod10] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod10 DEFAULT 0,
[CrIsAvailablePeriod11] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod11 DEFAULT 0,
[CrIsAvailablePeriod12] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod12 DEFAULT 0,
[CrIsAvailablePeriod13] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod13 DEFAULT 0,
[CrIsAvailablePeriod14] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod14 DEFAULT 0,
[CrIsAvailablePeriod15] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod15 DEFAULT 0,
[CrIsAvailablePeriod16] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod16 DEFAULT 0,
[CrIsAvailablePeriod17] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod17 DEFAULT 0,
[CrIsAvailablePeriod18] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod18 DEFAULT 0,
[CrIsAvailablePeriod19] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod19 DEFAULT 0,
[CrIsAvailablePeriod20] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod20 DEFAULT 0,
[CrIsAvailablePeriod21] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod21 DEFAULT 0,
[CrIsAvailablePeriod22] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod22 DEFAULT 0,
[CrIsAvailablePeriod23] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod23 DEFAULT 0,
[CrIsAvailablePeriod24] [bit]NOT NULL CONSTRAINT DF_CrIsAvailablePeriod24 DEFAULT 0,
[CrShortName] [char](10) NOT NULL,
[CrLongName] [varchar](128) NULL,
CONSTRAINT [PK_Classroom] PRIMARY KEY CLUSTERED
(
[ClassRoomID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING ON
GO
INSERT INTO [deleteme].[dbo].[Classroom]
([CrIsAvailablePeriod01]
,[CrIsAvailablePeriod02]
,[CrShortName])
VALUES
(0,0,'A1')
,(0,1,'B1')
,(1,0,'C1')
,(1,1,'D1')
GO
USE [deleteme]
GO
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation] DROP CONSTRAINT [FK_Reservation_Classroom]
GO
USE [deleteme]
GO
/****** Object: Table [dbo].[Reservation] Script Date: 05/20/2011 08:29:59 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Reservation]') AND type in (N'U'))
DROP TABLE [dbo].[Reservation]
GO
USE [deleteme]
GO
/****** Object: Table [dbo].[Reservation] Script Date: 05/20/2011 08:29:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Reservation]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Reservation](
[ReservationId] [int] Identity (1,1)NOT NULL,
[ResClassroomID] [int] NOT NULL,
[ResDate] [date] NOT NULL,
[ResIsReservedPeriod01] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod01 DEFAULT 0,
[ResIsReservedPeriod02] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod02 DEFAULT 0,
[ResIsReservedPeriod03] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod03 DEFAULT 0,
[ResIsReservedPeriod04] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod04 DEFAULT 0,
[ResIsReservedPeriod05] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod05 DEFAULT 0,
[ResIsReservedPeriod06] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod06 DEFAULT 0,
[ResIsReservedPeriod07] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod07 DEFAULT 0,
[ResIsReservedPeriod08] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod08 DEFAULT 0,
[ResIsReservedPeriod09] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod09 DEFAULT 0,
[ResIsReservedPeriod10] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod10 DEFAULT 0,
[ResIsReservedPeriod11] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod11 DEFAULT 0,
[ResIsReservedPeriod12] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod12 DEFAULT 0,
[ResIsReservedPeriod13] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod13 DEFAULT 0,
[ResIsReservedPeriod14] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod14 DEFAULT 0,
[ResIsReservedPeriod15] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod15 DEFAULT 0,
[ResIsReservedPeriod16] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod16 DEFAULT 0,
[ResIsReservedPeriod17] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod17 DEFAULT 0,
[ResIsReservedPeriod18] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod18 DEFAULT 0,
[ResIsReservedPeriod19] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod19 DEFAULT 0,
[ResIsReservedPeriod20] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod20 DEFAULT 0,
[ResIsReservedPeriod21] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod21 DEFAULT 0,
[ResIsReservedPeriod22] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod22 DEFAULT 0,
[ResIsReservedPeriod23] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod23 DEFAULT 0,
[ResIsReservedPeriod24] [bit]NOT NULL CONSTRAINT DF_ResIsReservedPeriod24 DEFAULT 0,
CONSTRAINT [PK_Reservation] PRIMARY KEY CLUSTERED
(
[ReservationId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation] WITH CHECK ADD CONSTRAINT [FK_Reservation_Classroom] FOREIGN KEY([ResClassroomID])
REFERENCES [dbo].[Classroom] ([ClassRoomID])
GO
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Reservation_Classroom]') AND parent_object_id = OBJECT_ID(N'[dbo].[Reservation]'))
ALTER TABLE [dbo].[Reservation] CHECK CONSTRAINT [FK_Reservation_Classroom]
GO
INSERT INTO [deleteme].[dbo].[Reservation]
([ResClassroomID]
,[ResDate]
,[ResIsReservedPeriod01]
,[ResIsReservedPeriod02])
VALUES
(1,'06-02-2011',1,0)
,(1,'06-02-2011',0,1)
,(2,'06-03-2011',1,1)
,(4,'06-03-2011',0,1)
GO
下面的代码将返回三个结果集。第一组是可用性计算,第二组是教室表列表,最后是预订表
declare @when date
set @when = '06-03-2011'
;With CTE_Res AS
(
SELECT
Reservation.ResClassroomID AS 'ResClassroomID'
,ResDate as 'ResDate'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod01] as int)),0)as BIT) AS'IsReserved01'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod02] as int)),0)as BIT) AS'IsReserved02'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod03] as int)),0)as BIT) AS'IsReserved03'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod04] as int)),0)as BIT) AS'IsReserved04'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod05] as int)),0)as BIT) AS'IsReserved05'
, CAST(ISNULL(MAX(CAST([ResIsReservedPeriod06] as int)),0)as BIT) AS'IsReserved06'
FROM
Reservation
WHERE ResDate = @when --'2011-06-03'
GROUP BY Reservation.ResClassroomID, ResDate
)
--Select * from CTE_RES
SELECT
Classroom.ClassRoomID
,Classroom.CrShortName
, CASE Classroom.CrIsAvailablePeriod01
WHEN 0 then 0
Else 1 ^ ISNULL(CTE_Res.IsReserved01,0)
END As 'IsOpenPeriod01'
, CASE Classroom.CrIsAvailablePeriod02
WHEN 0 then 0
Else 1 ^ ISNULL(CTE_Res.IsReserved02,0)
END As 'IsOpenPeriod02'
--, CTE_Res.ResDate
, @when as [Day]
FROM
Classroom
LEFT OUTER JOIN CTE_Res
ON Classroom.ClassRoomID = CTE_Res.ResClassroomID
--WHERE ResDate = '2011-06-03'
SELECT [ClassRoomID]
,[CrShortName]
,[CrIsAvailablePeriod01]
,[CrIsAvailablePeriod02]
FROM [deleteme].[dbo].[Classroom]
SELECT TOP 200 [ResClassroomID]
,ResDate
,[ResIsReservedPeriod01]
,[ResIsReservedPeriod02]
,[ResDate]
FROM [deleteme].[dbo].[Reservation]
WHERE ResDate = @when --'2011-06-03'