很抱歉提出这么愚蠢的问题。我对SQL很新。
问题是:我有2张桌子
CREATE TABLE [dbo].[Projects]
(
[name] VARCHAR (30) NOT NULL,
[company] VARCHAR (200) NOT NULL,
[manager] VARCHAR (30) NOT NULL,
[start_date] DATETIME NOT NULL,
[end_date] DATETIME NULL,
PRIMARY KEY CLUSTERED ([name] ASC, [company] ASC),
FOREIGN KEY ([company])
REFERENCES [dbo].[Companies] ([email])
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([manager])
REFERENCES [dbo].[Managers] ([username])
);
CREATE TABLE [dbo].[Manager_assign_Regular_Employee_Project]
(
[project_name] VARCHAR (30) NOT NULL,
[company] VARCHAR (200) NOT NULL,
[regular_employee] VARCHAR (30) NOT NULL,
[manager] VARCHAR (30) NOT NULL,
PRIMARY KEY CLUSTERED ([project_name] ASC, [company] ASC, [regular_employee] ASC),
FOREIGN KEY ([project_name], [company])
REFERENCES [dbo].[Projects] ([name], [company])
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([regular_employee])
REFERENCES [dbo].[Regular_Employees] ([username]),
FOREIGN KEY ([manager])
REFERENCES [dbo].[Managers] ([username])
);
我想确保一名员工不能同时在两个以上的项目中工作。
例如:
p1 regular1 STARTDATE=1/1/2017 ENDDATE=1/5/2017
p2 regular1 STARTDATE 1/5/2017 ENDDATE=1/20/2017
这两个记录是可以的,但是如果我添加另一个与2个3个项目相交的记录,那么它应该被拒绝
我试图在2个项目表和第二个项目表之间进行连接但是我失败了
答案 0 :(得分:1)
在某些时候,你需要弄清楚 你应该做什么才能开始编写代码。你说"我想确定......"。所以描述你的过程。当他们不知道你想要完成什么时,向别人寻求建议并不是很有用。
由于这是一堂课,你应该试着自己解决这个问题。给定2个分配行,您如何知道它们是否重叠?有时候实际在纸上画东西会有所帮助。绘制一个包含一段时间的时间表。比如说1月1日到6月30日。现在在这个时间轴上画一条代表随机时间的线。比如2月5日到3月15日。接下来绘制一系列重叠且不与第一个周期重叠的句点。现在看看每个"提议"句点(2到5)并确定您需要什么逻辑来确定找到重叠的那些逻辑并忽略那些不重叠的逻辑。这种绘图的一个例子是
提示 - 您比较开始到结束和结束开始。暂时忽略空值以使事情变得更容易。另一个提示 - 将这些行放在表中并编写查询以查找哪些行与第1行重叠。
还有一条评论。不 - 您的样本数据不确定。结束日期是员工在项目上工作的最后一天。因此,同一个员工也不能开始处理不同的项目。那是重叠的。您的日期必须包含在内。否则,你将面临一个充满问题的世界。如果您只关心日期,那么请使用DATETIME列。考虑用于列的正确数据类型。不要因为习惯或懒惰而把一些东西打成一团。架构还存在其他问题,但一次只关注一件事。