如何在SQL中实现这种双连接?

时间:2013-02-16 10:56:59

标签: sql join sqlite inner-join

我有这个查询,它连接存储在缓存表中的事件名称。

SELECT OccurrenceCache.occurrence_date, CalendarItem.summary FROM OccurrenceCache
    INNER JOIN CalendarItem ON CalendarItem.ROWID = OccurrenceCache.event_id
    WHERE OccurrenceCache.occurrence_date >= (strftime('%s', 'now', 'localtime', 'start of day') - strftime('%s', '2001-01-01', 'start of day')) AND OccurrenceCache.occurrence_end_date <= (strftime('%s', 'now', 'localtime', 'start of day') - strftime('%s', '2001-01-01', 'start of day') + 24 * 60 * 60);

现在我想要包含事件的位置数据,这些数据存储在名为 Location 的表中。 CalendarItem.location_id引用位置条目(0表示未指定位置)。我用另一个JOIN语句尝试了它,但它不起作用:

SELECT OccurrenceCache.occurrence_date, CalendarItem.summary, Location.title FROM OccurrenceCache
    INNER JOIN CalendarItem ON CalendarItem.ROWID = OccurrenceCache.event_id
    INNER JOIN Location ON Location.ROWID = CalendarItem.location_id
    WHERE OccurrenceCache.occurrence_date >= (strftime('%s', 'now', 'localtime', 'start of day') - strftime('%s', '2001-01-01', 'start of day')) AND OccurrenceCache.occurrence_end_date <= (strftime('%s', 'now', 'localtime', 'start of day') - strftime('%s', '2001-01-01', 'start of day') + 24 * 60 * 60);

返回0结果。

1 个答案:

答案 0 :(得分:5)

如果Location表中的所有条目与calenderitem表不匹配,则使用LEFT JOIN代替解决方案。

SELECT OccurrenceCache.occurrence_date, CalendarItem.summary, Location.title FROM OccurrenceCache
    INNER JOIN CalendarItem ON CalendarItem.ROWID = OccurrenceCache.event_id
    LEFT JOIN Location ON Location.ROWID = CalendarItem.location_id
    WHERE OccurrenceCache.occurrence_date >= (strftime('%s', 'now', 'localtime', 'start of day') - strftime('%s', '2001-01-01', 'start of day')) AND OccurrenceCache.occurrence_end_date <= (strftime('%s', 'now', 'localtime', 'start of day') - strftime('%s', '2001-01-01', 'start of day') + 24 * 60 * 60);

Using Outer Joins in SQL