我有4张表如下; SCHEDULES , SCHEDULE_OVERRIDE , SCHEDULE_LOCATION_OVERRIDES 和 LOCATION
我需要从所有表中返回所有行,因此运行此查询可以正常工作,为任何不存在的值添加NULL值:
SELECT.....
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id)
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
LEFT JOIN location l ON slo.location_id = l.id
ORDER BY s.id, so.id, slo.id, l.id
然后我需要在schedule_override end_date字段上重写结果。我的问题是,一旦我这样做,就没有返回SCHEDULE表的结果。我需要返回所有计划,即使未满足覆盖end_date标准。
继承人我正在使用的东西:
SELECT.....
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id)
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
LEFT JOIN location l ON slo.location_id = l.id
WHERE so.end_date > '2011-01-30' OR so.end_date IS NULL
ORDER BY s.id, so.id, slo.id, l.id
欣赏任何想法/评论。
最好的问候,本。
答案 0 :(得分:4)
您是否尝试将其放入ON
条款?
SELECT.....
FROM (schedule s LEFT JOIN schedule_override so ON so.schedule_id = s.id AND (so.end_date > '2011-01-30' OR so.end_date IS NULL))
LEFT JOIN schedule_location_override slo ON slo.schedule_override_id = so.id
LEFT JOIN location l ON slo.location_id = l.id
ORDER BY s.id, so.id, slo.id, l.id
答案 1 :(得分:3)
这是外部联接的一个相当常见的错误。
您需要将限制Join的所有内容放入该表的“ON”部分,否则您实际上正在将连接转换为内部连接。
因此,在这种情况下将WHERE子句移动到schedule_override的ON部分,你应该没问题。
答案 2 :(得分:1)
是的,当您离开连接时,可能是找不到行,并且结果中的字段为NULL。在WHERE子句中添加条件时,该值必须与该条件匹配,如果它为NULL则不匹配。
这不应该是一个问题,因为你明确地检查了NULL,所以我真的不知道为什么这个条件失败,除非它 返回一个日期,但那个日期是2011年-01-30。
无论如何,您可以尝试将条件移动到连接。它将消除检查NULL的需要,尽管它确实不会产生任何影响。
SELECT.....
FROM
schedule s
LEFT JOIN schedule_override so
ON so.schedule_id = s.id
AND so.end_date > '2011-01-30'
...