预订系统中的SQL

时间:2014-04-23 09:01:57

标签: c# asp.net sql postgresql

我正在使用C#和postgreSQL数据库构建一个asp.net应用程序。该应用程序是医生办公室的预订系统。

我有预约约会的下表:

enter image description here

我有以下表格:

enter image description here

两个表中的列时间之间存在关系(tbl_appointment中的时间是tbl_times中时间的外键)。

在应用程序中,我有一个如下所示的下拉列表。用户首先选择医生,然后选择日期,然后单击下拉列表以选择时间。带有时间的下拉列表从数据库tbl_times加载。

enter image description here

现在我的问题: 如何编写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'
 )

2 个答案:

答案 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());
            }