我正在使用C#和postgreSQL数据库构建一个asp.net应用程序。该应用程序是医生办公室的预订系统。
我有预约约会的下表:
我有以下表格:
两个表中的列时间之间存在关系(tbl_appointment中的时间是tbl_times中时间的外键)。
在应用程序中,我有一个如下所示的下拉列表。用户首先选择医生,然后选择日期,然后单击下拉列表以选择时间。带有时间的下拉列表从数据库tbl_times加载。
现在我的问题: 如何编写SQL只加载没有约会的时间? 如果用户首先选择Dr D然后选择日期2014-04-23,那么在下拉列表中我想从tbl_times加载所有时间,除了08:00和10:00。
更新 我的问题是如何排除记录。 我试过这个SQL(当然我不写值):
SELECT time
FROM tbl_times
WHERE time NOT IN (
SELECT time
FROM tbl_appointment
Where doctor = 'Dr D' AND date = '2014-04-23'
)
答案 0 :(得分:2)
你为自己的生活变得艰难,因为你没有医生桌。我也会有一个DateTime列而不是Date和Time。我的建议是:
select t.DateTime, d.Name from times t
cross join doctors d
left join Appointments a on t.DateTime = a.DateTime and d.DoctorID = a.DoctorID
where a.ID is null
这将为您提供所有医生的免费约会清单。
正如我在评论中提到的,您需要阅读SQL Injection Attacks。就目前而言,您的代码非常容易受到攻击。
答案 1 :(得分:0)
好的,所以我找到了解决方案。这就是我的方式:
conn.Open();
NpgsqlCommand command = new NpgsqlCommand("SELECT time FROM tbl_time WHERE time NOT IN (SELECT time FROM tbl_appointment Where doctor = '" + doc + "' AND date = '" + date + "')", conn);
NpgsqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
ddTime.Items.Add(DateTime.Parse(dr["time"]ToString()).ToShortTimeString());
}