Sql 确保员工不';I don’我不能同时参与最多2个项目
很抱歉问了这么愚蠢的问题。一般来说,我对SQL是相当陌生的 问题是:我有两张桌子Sql 确保员工不';I don’我不能同时参与最多2个项目,sql,sql-server,Sql,Sql Server,很抱歉问了这么愚蠢的问题。一般来说,我对SQL是相当陌生的 问题是:我有两张桌子 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_dat
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个项目表和第二个项目表之间进行连接,但失败得很惨在开始编写代码之前,您需要弄清楚应该做什么。你说“我想确定……”。请描述一下你的过程。当别人不知道你到底想做什么时,向他们征求建议是没有用的 既然这是一门课,你应该自己去弄清楚。给定两个作业行,您如何知道它们是否重叠?有时在纸上画东西会有帮助。绘制一个包含时间跨度的时间线。比如说1月1日到6月30日。现在在这个时间线上画一条线,代表一个随机的时间段。2月5日至3月15日。接下来,绘制一个重叠和不重叠第一个周期的周期范围。现在查看每个“建议的”时段(2到5),并确定需要什么逻辑来确定找到重叠的时段所需的逻辑,忽略不重叠的时段。此类图纸的一个示例是 提示-您比较开始到结束和结束到开始。暂时忽略空值以使事情变得更简单。另一个提示-将这些行放入表中,并编写查询以查找哪些行与第1行重叠
还有一条评论。否-您的样本数据不正常。结束日期是员工在项目上工作的最后一天。因此,同一名员工也不能在不同的项目上开始工作。这是重叠。您的日期必须包括在内。否则,你将面临一个充满问题的世界。如果您只关心日期,那么不要使用DATETIME列。考虑用于列的正确数据类型。不要只是出于习惯或懒惰而把东西拼凑在一起。模式还有其他问题,但每次只关注一件事 你尝试了什么,得到了什么结果?你期待什么结果?您的代码是MySQL还是MS-SQL?如果您的问题与SQL Server有关,则可能需要对此进行不同的标记。(编辑:看起来Ramond已经帮你做了标记。谢谢。)我已经将标记从MySQL更改为SQL server。因为这显然是SQL server语法。我尝试将2个项目表与Manager\u assign\u Regular\u Employee\u Project表连接起来,检查p1是否与p2的日期重叠,并在发生此情况时计数happens@MohamedHeshamIbrahim你喜欢问/回答一千个问题吗?为什么不能使用触发器?在某些情况下,您必须编写代码,要么在插入/更新时强制执行您的需求,要么编写在插入/更新之前执行相同操作的逻辑。你选择……如果他们不这样做,那真是太遗憾了,这只是说说而已。