我的表和属性是:
appointment_end_time (table)
appointment_end_time_id (int)(pk)(ai)
appointment_end_date (datetime)
appointment_start_time (table)
appointment_date_id (int)(pk)(ai)
appointment_start_date (datetime)
instructor(table)
instructor_id (int)(pk)(ai)
firstname varchar(45)
lastname varchar(45)
appointment_timetable
appointment_timetable_id int(11) AI PK
instructor_id int(11) FK
appointment_date_id int(11) FK
appointment_end_time_id int(11) FK
SELECT a.appointment_timetable_id, i.instructor_id, ad.appointment_start_date, aet.appointment_end_date
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
JOIN appointment_start_time ad on ad.appointment_date_id = a.appointment_date_id
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id
ORDER BY a.appointment_timetable_id;
但是,此代码在执行时没有选择任何行,因此我想知道我做错了什么,任何帮助将不胜感激
示例行: (appointment_end_time)
appointment_end_time_id appointment_end_date
1 2016-12-26 14:00:00
2 2016-12-24 13:00:00
3 2016-12-26 13:00:00
(appointment_start_time)
appointment_date_id appointment_start_date
1 2016-12-26 15:00:00
2 2016-12-24 16:00:00
3 2016-12-26 15:30:00
instructor_id firstname lastname
1 Sasha Thompson
2 Laura Robinson
3 John Walters
appointment_timetable
appointment_timetable_id instructor_id appointment_date_id appointment_end_time_
1 Blank Blank Blank
2 Blank Blank Blank
3 Blank Blank Blank
答案 0 :(得分:3)
您需要学习如何自己诊断问题。查询没有返回预期结果是一个常见问题,您应该了解如何解决问题以找到问题。
让我们从您的查询开始:
SELECT a.appointment_timetable_id, i.instructor_id, ad.appointment_start_date, aet.appointment_end_date
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
JOIN appointment_start_time ad on ad.appointment_date_id = a.appointment_date_id
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id
ORDER BY a.appointment_timetable_id;
你要做什么来分解它是从第一个表开始,然后添加连接(以及条件,尽管你没有这里有任何条件),一次一个,直到出现数据问题。我发现这是最简单的方法,使用select *或选择top 1 *(或者前10名,因为我通常喜欢看多个记录)而不是字段列表,因为那样你就不必寻找那些字段了与您尚未添加的联接相关联。
首先从
开始SELECT top 10 *
FROM db12405956.appointment_timetable a
然后尝试
SELECT top 10 *
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
然后
SELECT top 10 *
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
JOIN appointment_start_time ad on ad.appointment_date_id = a.appointment_date_id
最后
SELECT top 10 *
FROM db12405956.appointment_timetable a
JOIN instructor i on i.instructor_id = a.instructor_id
JOIN appointment_start_time ad on ad.appointment_date_id = a.appointment_date_id
JOIN appointment_end_time aet on aet.appointment_end_time_id = a.appointment_end_time_id
ORDER BY a.appointment_timetable_id;
在某些时候,您会看到记录丢失的位置,也就是问题的位置。然后,您可能需要查看要加入的字段以及数据集中的数据,以了解它们未返回任何匹配项的原因。例如,如果您加入日期,则可以将它们存储为一个表中的日期,将varchar存储在另一个表中,并将日期存储在日期" 01/01/2016'不等于2016年1月1日'或者有时列中有某种前缀或后缀不在另一个表中。像一个表中的PR2345和另一个表中的2345。有时查询是正确的,没有行真正符合条件。这可能是因为数据尚未完全填充(想想为尚未生效的系统编写报告,没有已完成操作的数据,因为尚未完成)或者因为某些假设中的要求是错误的,或者是因为应该没有匹配的记录。它甚至可能是数据输入中的错误。
根据问题的性质,您可能需要返回所有记录或仅使用select top 1(因为所有记录都在消失)。使用SELECT *这种方式将有助于返回太多或重复的记录,有时候是返回的字段会影响结果集。 请注意,我并不是说在最终结果集中使用SELECT *,它只是在这里用作诊断工具。
在您的情况下,问题看起来好像在第一个表中。教师ID和样本中的其他字段都有空白,因此没有任何内容可以加入。 (您只提供了一个示例,因此表的其余部分可能不是这样的。)如果这种情况还没有由于将其添加到尚未生效的功能,那么您可以测试您的查询只有将测试数据添加到表中。完成单元测试后,请务必删除此数据。如果数据应该存在,那么您需要查看应用程序中的插入错误。