在我的预订系统中,我有三张桌子:tbl_times随时都有。 tbl_client包含所有客户端,tbl_app包含所有预约约会。
我想编写SQL来显示tbl_times的所有时间以及特定医生在特定日期预订的时间的客户名称。
甚至可以这样做吗?查看图片我想要显示的内容(黄色预约时间)。
我现在有这个代码,但它显示的是预订的时间,而不是所有时间。
conn.Open();
string sql = "SELECT tbl_app.time, tbl_client.clientname FROM tbl_app, tbl_client WHERE tbl_app.date = '2014-05-05' AND tbl_app.drId = '4' AND tbl_client.clientId = tbl_app.clientId";
DataSet ds = new DataSet();
DataTable dt = new DataTable();
NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
ds.Reset();
da.Fill(ds);
dt = ds.Tables[0];
GridView1.DataSource = dt;
GridView1.DataBind();
答案 0 :(得分:2)
试试这个
select t.times,
ISNULL(tc.clientname,'') as clientname
from tbl_times t
left join tbl_app ta
on t.times = ta.times
and ta.date = '2014-05-05' AND ta.drId = '4'
left join tbl_client tc
on ta.clientid = tc.clientid
答案 1 :(得分:0)
你想要
LEFT join tbl_times
LEFT join将返回左表中的所有行。
您应该重新考虑使用包含1列的表格
编辑:
考虑为时间添加ID以便更轻松地使用SQL /语法
TIMEID |倍
0 | 08:00
1 | 08:30 30
2 | 09:00
等
答案 2 :(得分:0)
SELECT t.times time, c.clientname FROM tbl_times t
LEFT JOIN tbl_app a ON a.time = t.times
LEFT JOIN tbl_client c ON c.clientid = a.clientid
答案 3 :(得分:0)
这就是我要做的事情:
SELECT a.time, c.clientname
FROM tbl_times t
LEFT JOIN tbl_app a on t.time = t.time
JOIN tbl_client c on a.clientid = c.clientid
WHERE a.drID = 4 and a.date = '2014-05-05'
编辑:上面的代码不起作用。下面的代码确实有效,它使用子查询。如果您的选择标准变得更复杂,这可能是一个很好的方法。
select t.[time], ISNULL( c.clientname, '') as clientname from
tbl_times t
left join (select * from tbl_app where drID = 4 and [date] = '2014-05-05')
as doc on t.time = doc.[time]
left join tbl_client c on doc.clientID = c.clientID